python多进程multiprocessing包中queue、pipe、manager模块的功能介绍(超易懂哦!)

关于multiprocessing的Queue效率问题 今天大半天都在折腾着一个问题,就是从kafka消费消息后,后面的业务处理一直处理不过来,总是延后几个小时。为了解决这个问题,不断去调试代码,查找到相对耗时的位置,最终定位是Qeueue的问题。先上一段简化版的代码。 #!/usr/bin/env python #-*- coding:utf-8 -*- from cachetools import TTLCache import os impo... 阅读详情
AI摘要

本文详细介绍了Python中多进程通信的几种方式,包括队列(queue)、管道(pipe)和共享内存(manager)等模块的使用方法,并提供了实例代码帮助理解。

在这里插入图片描述

python多进程主要用于解决python自身含有的GIL(即全局解释器锁)所导致的不能并行任务的问题,之前已经介绍了multiprocessing包的基本使用方式,本文简要介绍一下multiprocessing包中含有的几个模块pipe(管道)、queue(队列)、manager,这几个模块在某些较为复杂的实际应用中还是很有用处的。


queue(队列)

python自身本来就带有queue模块,此模块正如其名,发挥的是队列功能,当然这种队列的传递也是能够发挥通信作用的。python官方文档的解释是queue模块实现多生产者,多消费者队列,能够在多个生产者和消费者之间通信。当信息必须安全的在多线程之间交换时,它在线程编程中是特别有用的。此模块中的 Queue 类实现了所有锁定需求的语义。

简单说queue其实就像进程或线程锁一样,起到对信息的保护作用。由于队列的存在,python函数中的生产者函数及消费者函数能够准确、有确定方向的进行通信。使这些需要被传递的信息不会因为多线程或多进程的存在而出错。queue储存某些生产者函数产生的信息,再将这些信息一起传递给消费者函数。当然这些函数可以是在不同的进程中运行的,从而达到进程间通信的效果。使用了队列后就不会有信息提前或者滞后到达消费者进程处,这样也就不容易导致信息出错或者紊乱。

multiprocessing中queue模块包含的方法有qsize()(返回队列包含元素的多少)、empty()(即给出队列是否为空的判断,空为True)、full()(即给出队列是否已满的判断,因为开始的时候设置队列可以设置最大拥有元素的多少)、put()(即将元素放入队列)、get()(从队列中获取元素,注意每获取一个队列中元素就减少一个)、close()(表示当前队列不再放入新的元素)。

例:

import multiprocessing

def test(q):
	for i in range(10):
		q.put(i)   # 将元素放入queue
	q.close()
	
def get_q(q):
	while not q.empty():    # 判断队列是否为非空,非空才继续执行下一步
		res = q.get()       # 获取一个元素
		print(res)
		# print(q.qsize())
		
if __name__ == '__main__':
	q = multiprocessing.Queue()      # 定义queue,这里可以传入参数,即队列所含最大元素量
	p1 = multiprocessing.Process(target=test,args=(q,))   # 多进程
	p2 = multiprocessing.Process(target=get_q,args=(q,))
	# 此例仅为介绍用,实际应用时创建的进程可以有丰富的功能,只需要将queue作为一个参数传入进程即可。
	p1.start()
	p2.start()
	p1.join()
	p2.join()	

结果:

在这里插入图片描述

pipe(管道)

pipe(管道)在编程语言中也是用于通信功能,即将某函数产生的结果通过管道的一端传递给管道的另一端,这就是管道名称的来源。python中管道一般用于多进程操作,可以用于在进程间传递消息。

与队列不同的地方是pipe能进行双向通信,但是队列只能单向传递消息。

例:

import multiprocessing

def test1(conn):
	conn.send('test1传送到:jack')      # 传递一个信息‘jack’
	conn.send('test1传送到:mary')	   # 传递另个信息‘mary’	
	print(conn.recv())     # 获取从管道的另一端发送来的第一个值
	print(conn.recv())     # 获取从管道的另一端发送来的第二个值
	
def test2(conn):
	conn.send('test2传送:你好')      # 传递一个信息‘你好’
	conn.send('test2传送:HELLO')    # 传递另个信息‘HELLO’
	print(conn.recv())    # 获取从管道的另一端发送来的第一个值
	print(conn.recv())    # 获取从管道的另一端发送来的第二个值

if __name__ == '__main__':
	p_conn,c_conn = multiprocessing.Pipe()  # 定义一个管道的两端,之后将这两端传出去
	p1 = multiprocessing.Process(target=test1,args=(p_conn,))    # 把一端给test1
	p2 = multiprocessing.Process(target=test2,args=(c_conn,))    # 另一端给test2
	p1.start()
	p2.start()
	p1.join()
	p2.join()
	# 这样就将test1与test2函数进行了管道传输,test1的内容传给了test2,test2的内容传给了test1。
	# test1与test2被分配到了不同的进程,因此这样相当于就进行了多进程中进程间的通信。

结果:

在这里插入图片描述

manager(共享内存管理)

manager模块用于多进程中共享内存的管理,其实也就是全局变量的管理。默认情况下子进程产生的全局变量仅子进程自身可以使用,主进程是获取不到子进程中全局变量的变化的。这也是因为当下使用的多核电脑的每个核都是分开工作的,即每个子进程都在不同核上工作,因此要设置全局变量就不是默认的,需要额外设置(注意:这一点不同于多线程,多线程中子线程的全局变量主线程能识别到,因为是单核运行)。

除了manager外,multiprocessing包还含有value、array也可以用于共享内存的处理。

使用value、array的例子:

import multiprocessing

def test(v,a):
	v.value = 123         			# 这里修改传入的value的值
	for i in range(len(a)):			# 这里逐个修改传入的array中的值
		a[i] = 'o'

if __name__ == '__main__':
	v = multiprocessing.Value('d')    # 将v指定为Value
	a = multiprocessing.Array('u','nihao')   # 将a指定为字符型array,官方文档提示说后续u可能被删除
	process = multiprocessing.Process(target=test,args=(v,a)) # 传入test函数,开启子进程
	process.start()
	process.join()
	print(v.value)     				  # 打印出v的值,检查是否被改变 
	print(a[:])                       # 打印出a的序列,检查是否改变

结果:

在这里插入图片描述
python官方文档说明manager支持类型有: list 、 dict 、 Namespace 、 Lock 、 RLock 、 Semaphore 、 BoundedSemaphore 、 Condition 、 Event 、 Barrier 、 Queue 、 Value 和 Array 。

此处以list和dict为例:

import multiprocessing
def test(list1,dict1):
	dict1['name1'] = 'jack'     # 增加dict1的内容
	dict1['name2'] = 'mary'     
	list1.reverse()             # 将list1中的内容颠倒
if __name__ == '__main__':
	with multiprocessing.Manager() as manager:     # 引入manager
		list1 = manager.list(range(5))             # 设置list1和dict1为共享对象
		dict1 = manager.dict()
		p = multiprocessing.Process(target=test,args=(list1,dict1))  # 传入函数中对list1与dict1修改
		p.start()
		p.join()
		print(list1)  # 检查是否修改
		print(dict1)

结果:

在这里插入图片描述

叮!

其实除了上面介绍的这些模块外还有Lock()模块也是很重要的一个模块,但是使用起来是较为简单的,这里就不再介绍了。另外还看到了semaphore模块,此模块称为信号量,用于控制线程数,即只有线程获取了信号后才能运行否则就阻塞。semaphore模块是为了防止线程数太多导致任务出错或机器故障而设计的。

参考:https://docs.python.org/zh-cn/3.6/library/multiprocessing.html#multiprocessing.Queue.empty
参考:https://blog.youkuaiyun.com/haeasringnar/article/details/79917057

Python全栈学习笔记day 38:进程间通信:管道(multiprocessing.Pipe)、进程之间的数据共享(multiprocessing.Manager)、进池Pool模块、回调函数 目录 一、进程间通信:管道(multiprocess.Pipe) 二、管道实现生产者消费模型 三、进程之间的数据共享 四、进程池和multiprocessing.Pool模块 五、回调函数 一、进程间通信:管道(multiprocess.Pipe) 管道示意图:   子进程接收主进程消息: from multiprocessing import Pipe,Process ... 阅读详情

相关推荐

Python中多进程间通信(multiprocessing.Manager)

Python中写多进程的程序,一般都使用multiprocesing模块。进程间通讯有多种方式,包括信号,管道,消息队列,信号量,共享内存,socket等。这里主要介绍使用multiprocessing.Manager模块实现进程间共享数据。 Python中进程间共享数据,处理基本的queue,pipe和value+array外,还提供了更高层次的封装。使用multiprocessing.Man...

Never-Giveup的博客 3万+

python中的Queue与多进程(multiprocessing)

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34329187的博客 3286

Python 多进程环境下的安全数据共享:Manager、Pipe 和 Queue 深度解析

在Python多进程编程中,数据共享是一个关键挑战。本文深入解析了三种常用的数据共享工具:multiprocessing.Manager、Pipe 和 Queue,并提供了代码示例帮助理解其应用场景。Manager 适用于共享复杂数据结构,Pipe 适合简单的一对一进程通信,而 Queue 则适用于生产者-消费者模型。文章还总结了如何根据具体需求选择合适的数据共享方式,并提供了最佳实践建议,如避免竞争条件、减少进程同步和使用日志监控。通过这些工具和策略,可以有效提升多进程任务的稳定性和性能。

铭渊老黄 1229

python多进程通信之multiprocessing.Queue

multiprocessing.Queue()和queue.Queue()的区别 Queue.Queue是进程内非阻塞队列,用于进程内的各函数模块或线程间通信。 multiprocess.Queue是跨进程通信队列。但是不能用于multiprocessing.Pool多进程的通信。 multiprocessing.Manager 进程池multiprocessing.Pool()的多进程之间的通信...

yuanlulu的博客 2万+

解锁 Python 进程间通信:Queue、Pipe 与共享内存实战指南

Python进程间通信实战指南摘要 本文详细介绍了Python中五种进程间通信(IPC)方案,帮助开发者绕过GIL限制实现高效并行计算。主要内容包括:1) Queue适合多生产者-消费者模式;2) Pipe提供低延迟的一对一通信;3) 共享内存(Value/Array和shared_memory)实现高性能数据共享;4) Manager支持复杂数据结构;5) Socket/消息队列扩展跨机器通信。文章通过代码示例对比了各方案的性能、易用性和适用场景,指导开发者根据具体需求选择最佳方案。

铭渊老黄 1162

Python 多进程 multiprocessing 使用示例

multiprocessing 文档:https://docs.python.org/zh-cn/3.10/library/multiprocessing.html Process、Lock、Semaphore、Queue、Pipe、Pool:https://cuiqingcai.com/3335.html 把一个多线程改成多进程,主要有下面几种方法:...

墨鱼菜鸡 1173

Python multiprocessing使用详解

multiprocessing包是Python中的多进程管理包。 与threading.Thread类似,它可以利用multiprocessing.Process对象来创建一个进程。 该进程可以运行在Python程序内部编写的函数。 该Process对象与Thread对象的用法相同,也有start(), run(), join()的方法。 此外multiprocessing包中也有Lock/Eve...

gmHappy 13万+

Python教程:深入理解 Python multiprocessing.Queue

在 Python 编程中,多进程编程是利用计算机多核心资源的重要手段之一。然而,多进程之间的通信却是一个相对复杂的问题。在本文中,我们将深入探讨 Python 中的 multiprocessing.Queue 模块,它为多进程间的通信提供了便捷而高效的解决方案。

旦莫的博客 3454

Python进阶(十)多进程multiprocessing和subprocess模块

文章目录subprocess模块subprocess.run() 函数的使用subprocess.Popen()函数实时获取subprocess子进程的输出多进程multiprocessing为什么要多进程?多进程实现方法   进程是资源分配的最小单位,线程是CPU调度的最小单位。做个简单的比喻:进程=火车,线程=车厢。 subprocess模块   Python的subprocess模块,用来创建和管理子进程(不是线程),并能够与创建的子进程的stdin,stdout,stderr连接通信,获取子进程执行

小小何先生的学习之旅 1万+

python多进程 multiprocessing.pipe 管道没有数据接收端会卡死,无提示,无报错!!!

测试发现,没有生产时,消费也不运行。为什么? import multiprocessing as mp import time from multiprocessing import Pipe, Process, Manager sed, rec = Pipe() all_sed = 0 all_rec = 0 def sed_fun(p_conn): global all_sed...

Hello Word! 2946

el-table通过上下左右键移动光标

在Element Plus的el-table中包含el-input和el-select组件,要实现上下左右键控制光标位置,需要通过focus和blur跟踪判断当前是哪个el-input或el-select有焦点,当按键按下时,通过监听,计算下一个获取焦点元素的索引,通过focus方法将焦点切换至改元素。

秋思的博客 1350

python标准库、threading、multiprocessing、aiomultiprocess、进程/线程 同步、queue(队列)

multiprocessing 包提供了本地和远程并发操作,通过使用子进程而非线程有效地绕过了全局解释器锁。 因此,multiprocessing 模块允许程序员充分利用给定机器上的多个处理器。

freeking101的博客 2万+

(C#脚本)Unity中角色移动的几种实现方法,以及心得。(适合新手入门)

PS:首先我们要知道,在C#中Transform组件是可以直接调用的,而其他的(例如:Rigidbody,Animator)都需要通过 GetConpoment<组件的名称>(); 来获取进行实例化。 例子:调用Rigidbody2D private Rigidbody2D rb2D;//声明变量实例化 void Start() { rb2d = GetComponent<Rigidbody2D>();//获取 } 1.对Unity脚本写入有一定的思维了解...

qq_48860282的博客 1万+

python多进程 - 进程间的通信(Queue,Pipe,Value/Array,Manager)

前言 与多线程不同,多进程之间不会共享全局变量,所以多进程通信需要借助“外力”。在Python中,这些常用的外力有Queue,Pipe,Value/Array和Manager。 Queue 这里的Queue不是queue模块中的Queue——它在多进程中无法起到通信作用,我们需要multiprocessing模块下的。同时,由于Python的完美封装,它的实现原理可以说是对程序员完全透明,使...

老鹰的博客 3185

4、硬件工程师笔试面试知识器件篇——电阻(2025版本)

本文系统介绍了电阻的基础知识与应用。首先阐述了电阻的定义、工作原理及类型(固定/可变电阻),详细说明了常见电阻材料(碳膜、金属膜、线绕等)的特性与标记方法。重点分析了电阻在电路设计中的关键参数:功率计算需考虑1.5-2倍安全裕度,温度系数影响电路稳定性。文章还对比了不同封装形式(轴向/贴片/功率封装等)的适用场景,特别强调高功率电路需选择专用封装并做好散热设计。最后指出电路仿真可优化电阻选择,并列举了相关电子元件在设计中同样需要仿真验证。全文为硬件工程师提供了电阻选型的实用指导。

XU157303764的博客 5204

一文吃透:从零到一开发一套 ABAP RAP 应用的完整路径

ABAP RAP开发实战摘要 本文系统介绍了ABAP RESTful Application Programming Model (RAP)在企业级应用开发中的实施路径。文章以出差申请业务场景为例,详细拆解了RAP开发的六步主线流程: 数据库表设计:规范主键、审计字段设计 CDS数据建模:通过视图定义业务对象实体及关联 行为定义与实现:使用BDEF声明事务规则,Behavior Pool类实现业务逻辑 业务对象投影:裁剪服务接口视图 服务定义与绑定:按OData协议暴露服务 UI集成测试:支持Fiori E

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 507

【Python】multiprocessing 模块:多进程并行计算

Python的multiprocessing模块用于多进程并行计算,可以充分利用多核CPU进行任务加速,突破PythonGIL(全局解释器锁)的限制,提高程序执行效率。multiprocessing.Process创建进程以实现并行计算。Pool.map()批量处理任务,更高效。Queue、Manager进行进程间通信。Lock同步进程,防止竞争。适用于CPU密集型任务,如科学计算、数据处理、机器学习等。

彬彬侠的博客 2585

解读(DivideMix)DIVIDEMIX: LEARNING WITH NOISY LABELS AS SEMI-SUPERVISED LEARNING

这是Salesforce在今年年初出的一篇关于半监督学习的文章被ICLR 2020收录,目前还保持在SOTA状态。 文章主要做了两点工作: • 提出了一个co-divide方法。 • 利用label co-refinement 和co-guessing 改善之前的谷歌提出的MixMatch方法 1.co-divide方法 大概思路:同时训练两个网络,让每个网络在样本损失分布上去拟合GMM模型,并利用GMM模型,将训练数据分为标签数据和未标签数据,co-divide 使前面分的标签与未标签数据分别在

so 5041

python多进程:如何忽视子进程延迟执行并行计算——multiprocessing.Pipe()详解

在前几天的《python多进程与进程间通信:fork()方法和multiprocess实例》中,简明扼要地记录了些Python多进程的用法。 本文主要深入讲下pipe。主要是记录实践中遇到的问题:如何在多进程之间通过pipe()传输或共享一个实例对象;使用pipe()后为什么另一个进程会出来停滞现象而非并行执行;如何忽略其中一个进程的延迟,执行异步的并行计算。 pipe即一个管道,所创建管道返...

Yancy的博客 3287

RuoYi-Cloud-Plus使用minio进行文件上传图片后无法预览解决_修改minio配置minio桶权限---SpringCloud工作笔记198

在文件管理的位置,发现刚刚上传的图片文件,会显示 预览图片失败 后来经过多方查看,发现是minio的配置的问题。可以看到首先登录RuoYi-Cloud-Plus系统然后,打开文件管理页面可以看到,当上传了图片文件以后。登录以后,选中左侧Buckets,可以看到有自己用的桶,找到以后点击打开。显示文件展示中,文件预览失败,那么这个时候,去修改minio的配置。可以看到,点击配置管理,这里我们启用的是minio对吧。默认是没有配置的这个时候,是允许下载,但不允许预览的.

添柴程序猿的专栏 5563

Oracle EBS Tax 四国实现详解:印度、巴西、美国、阿根廷

印度:务必启用India Localization模块,不要尝试用标准EBTax模拟GST逻辑 巴西:必须配置NF-e接口,建议聘请本地税务顾问设置CFOP和NCM代码映射 美国:跨州业务强烈建议购买Vertex或Avalara服务,自建税率表维护成本极高 阿根廷:注意1:1:1架构限制,提前规划Legal Entity和OU结构

金牌架构师 260

在Python中优雅地用多进程:进程池 Pool、管道通信 Pipe、队列通信 Queue、共享内存 Manager Value

在Python中优雅地用多进程:进程池 Pool、管道通信 Pipe、队列通信 Queue、共享内存 Manager Value

丨汀、的博客 2685

YOLOv11改进 | 特殊场景检测篇 | 低照度图像增强网络SCINet改进黑暗目标检测(全网独家首发)

本文给大家带来的改进机制是低照度图像增强网络SCINet,SCINet(自校正照明网络)是一种专为低光照图像增强设计的框架。它通过级联照明学习过程和权重共享机制来处理图像,优化了照明部分以提升图像质量。我将该网络集成在YOLOv11的主干上针对于图像的输入进行增强,同时该网络的并不会增加参数和计算量,基本和普通的网络结构保持一致,同时该结构支持自定义调节层数,来控制图像增强的效果 ,非常适合想要在黑夜目标检测领域发表文章的读者,该基本网络不会影响模型的速度。欢迎大家订阅我的专栏一起学习YOLO!

Snu77的博客 2206

多进程间通信(multiprocessing.Manager)

Python中进程间共享数据,处理基本的queue,pipe和value+array外,还提供了更高层次的封装。使用multiprocessing.Manager可以简单地使用这些高级接口。 Manager()返回的manager对象控制了一个server进程,此进程包含的python对象可以被其他的进程通过proxies来访问。从而达到多进程间数据通信且安全。 Manager支持的类型有list...

heima201907的博客 1061

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Python3 进程multiprocessing的基本用法

进程的基本用法: multiprocessing是一个使用类似于线程模块的API支持产生进程的包。 多处理包提供本地和远程并发,通过使用子进程而不是线程有效地侧向执行全局解释器锁。 因此,多处理模块允许程序员充分利用给定机器上的多个处理器。 它可以在Unix和Windows上运行。 import multiprocessing import time def f(name): ...

JiangHui1211的博客 1675

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Python并发复习3 - 多进程模块 multiprocessing

python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程。Python提供了非常好用的多进程包multiprocessing,只需要定义一个函数,Python会完成其他所有事情。借助这个包,可以轻松完成从单进程到并发执行的转换。multiprocessing支持子进程、通信和共享数据、执行不同形式的同步,提供了Pro...

dc90000的博客 197

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

上一篇: python多进程模块(multiprocessing)的基本使用方法(想要轻松上手的不要错过啦!)
下一篇: 使用concurrent.futures模块快捷方便的进行多线程(池)或多进程(池)操作(python)
你大佬来啦
博客等级 码龄7年 322粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值