python之多线程,多进程理解

目录

一,什么是多线程多进程

1,1 多线程

1.2 多进程

二,多线程

2.1 使用threading模块

三,多进程

3.1 使用multiprocessing模块

3.2 多进程的优势

3.3 进程间的通信

四,如何选择多进程还是多线程

五,异步编程的替代方案(协程)


在开发过程中,提升程序的并发性能是开发者常常面临的挑战。为此,Python 提供了多线程多进程两种并发编程方式,来帮助我们充分利用系统资源,提高程序的执行效率。

一,什么是多线程多进程

1,1 多线程

1. 多线程(Multithreading)
线程是进程中的一个执行单元。一个进程可以包含多个线程,它们共享同一个内存空间,共同完成任务。在 Python 中,多线程通常用于 I/O 密集型任务(例如网络请求、文件读写等),因为这些任务往往会因为 I/O 操作而被阻塞。通过多线程,我们可以让程序在等待 I/O 操作时继续处理其他任务,从而提升程序的整体响应速度。

1.2 多进程

进程是操作系统中资源分配的最小单位,每个进程有自己独立的内存空间。多进程意味着同时运行多个进程,它们之间互不干扰,互相独立。多进程更适合 CPU 密集型任务(如大规模数据计算、图像处理等),因为 Python 的全局解释器锁(GIL)限制了多线程在多核 CPU 上的性能发挥,而多进程可以有效利用多个 CPU 核心来并行处理任务。

二,多线程

Python 提供了 threading 模块来创建和管理多线程。下面是一个简单的多线程示例:

2.1 使用threading模块

import threading
import timedef worker(n):print(f"Thread {n} started")time.sleep(2)print(f"Thread {n} finished")# 创建多个线程
threads = []
for i in range(5):thread = threading.Thread(target=worker, args=(i,))threads.append(thread)thread.start()# 等待所有线程结束
for thread in threads:thread.join()print("All threads finished")

示例中,我们创建了 5 个线程,每个线程都会执行 worker 函数。程序在所有线程执行完毕后才会继续往下执行。但是在python多线程中, 由于 Python 的全局解释器锁(GIL),多线程是伪的多线程,只是感觉多个任务在同时执行,Python 多线程在 CPU 密集型任务中无法充分利用多核 CPU 的优势。GIL 使得在任一时刻只有一个线程能执行 Python 字节码,这意味着多线程在处理 CPU 密集型任务时,并不会带来性能上的提升。因此,多线程适合用于 I/O 密集型任务,如网络请求、文件读写等,而不适合用于需要大量计算的 CPU 密集型任务。

三,多进程

Python 的 multiprocessing 模块允许我们通过多进程的方式执行并发任务。与多线程不同,多进程中的每个进程都有独立的内存空间,这使得它在 CPU 密集型任务中能够充分利用多核 CPU 的优势。

3.1 使用multiprocessing模块

import multiprocessing
import timedef worker(n):print(f"Process {n} started")time.sleep(2)print(f"Process {n} finished")if __name__ == '__main__':# 创建多个进程processes = []for i in range(5):process = multiprocessing.Process(target=worker, args=(i,))processes.append(process)process.start()# 等待所有进程结束for process in processes:process.join()print("All processes finished")

我们使用 multiprocessing.Process 来创建独立的进程。每个进程都会执行 worker 函数,并且彼此之间不会共享内存,独立运行。

3.2 多进程的优势

由于每个进程都有独立的内存空间,因此多进程可以充分利用多核 CPU 的优势。在处理 CPU 密集型任务时,多进程通常会比多线程带来更好的性能提升。此外,多进程不会受到 GIL 的限制,适合需要并行处理大量计算的场景。

3.3 进程间的通信

尽管多进程有独立的内存空间,有时我们仍需要在进程间共享数据。Python 提供了多种方式来实现进程间通信(IPC),例如使用 QueuePipe 等。

一个简单的进程间通信示例:

例子中,我们使用 Queue 实现了父进程和子进程之间的数据通信。

from multiprocessing import Process, Queuedef worker(q):q.put("Hello from the worker process")if __name__ == '__main__':q = Queue()p = Process(target=worker, args=(q,))p.start()print(q.get())  # 从队列中获取数据p.join()

四,如何选择多进程还是多线程

选择多线程还是多进程取决于你需要解决的任务类型:

I/O 密集型任务(如网络请求、文件读写):多线程通常更合适,因为它可以有效地隐藏 I/O 等待时间,提高并发效率。

CPU 密集型任务(如复杂计算、大规模数据处理):多进程更合适,因为它能有效利用多核 CPU 资源,并且避免了 GIL 的限制。

五,异步编程的替代方案(协程)

在某些场景下,除了多线程和多进程之外,Python 还提供了异步编程的方式来处理并发任务。asyncio 是 Python 内置的异步 I/O 框架,它能够帮助开发者在处理大量 I/O 操作时进一步提升性能。异步编程通过事件循环来管理任务的调度,是多线程的一种轻量级替代方案。线程是由系统来调度的,协程可以由开发来控制调度,协程就比线程更加的灵活,可看下篇文章python之协程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/43391.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OPPO手机如何实时翻译会议视频?视频翻译轻松应对多语言场景

在全球化日益深入的今天,跨语言沟通已成为职场和生活中的常见需求。无论是参加国际会议、观看外语视频,还是与海外客户交流,语言障碍都可能成为效率的绊脚石。幸运的是,OPPO手机凭借其强大的功能和智能化设计,为用户提…

28_跨域

目录 promise promise的基本语法 async await try catch promise 静态方法 跨域 跨域的解决方案 1-cors ​编辑 2-jsonp方案 3-代理服务器 promise promise 是一个es6新增的语法 承诺的意思 作用:是专门用来解决回调地狱!!!! promise的基本语法 // 基本语法:// Pr…

LeetCode Hot100 刷题笔记(4)—— 二叉树、图论

目录 一、二叉树 1. 二叉树的深度遍历(DFS:前序、中序、后序遍历) 2. 二叉树的最大深度 3. 翻转二叉树 4. 对称二叉树 5. 二叉树的直径 6. 二叉树的层序遍历 7. 将有序数组转换为二叉搜索树 8. 验证二叉搜索树 9. 二叉搜索树中第 K 小的元素 …

【漏洞复现】Apache Tomcat partial PUT文件上传反序列化漏洞复现(CVE-2025-24813)

❤️博客主页: iknow181 🔥系列专栏: 网络安全、 Python、JavaSE、JavaWeb、CCNP 🎉欢迎大家点赞👍收藏⭐评论✍ 0x00 免责声明 本文所述漏洞复现方法仅供安全研究及授权测试使用;任何个人/组织须在合法合规…

BurpSuit抓包失败-基础配置

问题描述:当开启拦截抓包的时候,burpsuite没有反应,好不容易经过一通配置,浏览器出现无法访问的情况。 解决办法: 下载浏览器插件 首先下载一个代理转换插件:Omega,这样比较方便,…

求解AX=XB 方法

一、简介 一文浅谈旋转变换:旋转矩阵、旋转向量、欧拉角、四元数-CSDN博客 在机器人学、计算机视觉和几何学中,经常会遇到求解矩阵方程 AXXB 的问题。这种方程通常出现在坐标系变换、手眼标定(Hand-Eye Calibration)等场景中。理…

AnimateCC基础教学:随机抽取获奖名单及奖品-V1.0原型版

舞台界面设计: 主轴第一帧代码: this.btnObj.addEventListener("click", updateStage.bind(this)); createjs.Ticker.addEventListener("tick", updateRandom.bind(this)) var _this this; var bPlaying false; var nameList ["张三…

深入了解Linux内核:task_struct结构详解

Linux 操作系统的广袤世界里,进程管理宛如一座大厦的基石,支撑着整个系统的稳定运行与高效运转 。而task_struct结构体,无疑是进程管理这座大厦的核心支柱,它承载着进程的关键信息,贯穿于进程从诞生到消亡的整个生命周…

IsaacLab最新2025教程(7)-引入IK solver控制机器人

机器人控制可以直接给定关节角进行驱动实现功能,完成任务,但是关节角不是很直观而且做teleoperation或者是结合VLA模型时候,用eef pose会更符合直觉一些,isaacsim用的是LulaKinematics,因为IsaacLab现在是ETHZ的团队在…

Vue——常用指令总结、指令修饰符、v-model原理、computed计算属性、watch监听器、ref和$refs

文章目录 一、概念理解二、指令1. 常用内置指令总结2. 常用指令修饰符3. 自定义指令4. v-model原理表单类组件封装 三、补充1. computed计算属性2. watch监视器3. ref和$refs 一、概念理解 【事件处理函数】 事件处理函数应该写到一个跟data同级的配置项(methods&a…

求职笔试题

PDD 最长公共子序列 1143-最长公共子序列 class Solution:def longestCommonSubsequence(self, text1: str, text2: str) -> int:"""二维动态规划"""m, n len(text1), len(text2)# dp [[0]* (n1)] * (m1) 这种写法错误,m1行…

【Ragflow】6. Ragflow-plus重磅更新:增加用户后台管理系统

概述 Ragflow本身并不包含用户管理的功能,我在系列前文中,写过一个脚本,用来批量插入用户,并自动加入团队,配置默认模型设置。然而,此方式需要用户安装对应环境,对普通用户并不友好。 因此我开…

什么是贴源库

贴源库的定义与核心概念 贴源库(Operational Data Store, ODS)是数据架构中的基础层,通常作为数据仓库或数据中台的第一层,负责从业务系统直接抽取、存储原始数据,并保持与源系统的高度一致性。其核心在于“贴近源头”…

MSTP+VRRP三层架构综合实验

一、实验目的 掌握VLAN、VRRP、STP和Eth-Trunk的基本配置方法。 实现内网与外网的通信,并确保网络的高可用性和冗余性。 理解DHCP、OSPF和NAT在网络中的应用。 二、实验环境 网络拓扑:如图所示,包含两台三层交换机(SW1、SW2&a…

未来村庄智慧灯杆:点亮乡村智慧生活​

在乡村振兴与数字乡村建设的时代进程中,未来村庄智慧灯杆凭借其多功能集成与智能化特性,已成为乡村基础设施建设领域的崭新焦点,为乡村生活带来了前所未有的便利,推动着乡村生活模式的深刻变革。​ 多功能集成:一杆多能…

RedHatLinux(2025.3.22)

1、创建/www目录,在/www目录下新建name和https目录,在name和https目录下分别创建一个index.htm1文件,name下面的index.html 文件中包含当前主机的主机名,https目录下的index.htm1文件中包含当前主机的ip地址。 (1&…

第十五章:Python的Pandas库详解及常见用法

在数据分析领域,Python的Pandas库是一个不可或缺的工具。它提供了高效的数据结构和数据分析工具,使得数据处理变得简单而直观。本文将详细介绍Pandas库的基本功能、常见用法,并通过示例代码演示如何使用Pandas进行数据处理。最后,…

算法为舟 思想为楫:AI时代,创作何为?

在科技浪潮汹涌澎湃的当下,AI技术以前所未有的态势席卷各个领域,创作领域亦未能幸免。当生成式AI展现出在剧本撰写、诗歌创作、图像设计等方面的惊人能力时,人类创作者仿佛置身于文明演化的十字路口,迷茫与困惑交织,兴奋与担忧并存。在AI时代,创作究竟该何去何从?这不仅…

[Raspberry Pi]如何將看門狗(WatchDog)服務建置在樹莓派的Ubuntu作業系統中?

看門狗(WatchDog)服務常應用於連網的嵌入式邊緣設備等IOT裝置和實體伺服器,主要是若這些連網裝置分散在各個應用環境中執行對應任務,例如感測物理數據,監控影像數據或執行各式Docker服務,當連網裝置因故異常,同時又處於…

Linux进程状态补充(10)

文章目录 前言一、阻塞二、挂起三、运行R四、休眠D五、四个重要概念总结 前言 上篇内容大家看的云里雾里,这实在是正常不过,因为例如 写实拷贝 等一些概念的深层原理我还没有讲解,大家不用紧张,我们继续往下学习就行!&…