8、多进程之间的通信
创始人
2024-03-03 04:50:51

多进程之间的常用通信方法有两种,及Queue和Pipe
一、Queue
Queue([maxsize]):创建共享的进程队列。maxsize是队列中允许的最大项数。如果省略此参数,则无大小限制。底层队列使用管道和锁定实现。另外,还需要运行支持线程以便队列中的数据传输到底层管道中。
Queue的实例q具有以下方法:

q.get( [ block [ ,timeout ] ] ):返回q中的一个项目。如果q为空,此方法将阻塞,直到队列中有项目可用为止。block用于控制阻塞行为,默认为True. 如果设置为False,将引发Queue.Empty异常(定义在Queue模块中)。timeout是可选超时时间,用在阻塞模式中。如果在制定的时间间隔内没有项目变为可用,将引发Queue.Empty异常。

q.get_nowait() :同q.get(False)方法。

q.put(item [, block [,timeout ] ] ) :将item放入队列。如果队列已满,此方法将阻塞至有空间可用为止。block控制阻塞行为,默认为True。如果设置为False,将引发Queue.Empty异常(定义在Queue库模块中)。timeout指定在阻塞模式中等待可用空间的时间长短。超时后将引发Queue.Full异常。

q.qsize() :返回队列中目前项目的正确数量。此函数的结果并不可靠,因为在返回结果和在稍后程序中使用结果之间,队列中可能添加或删除了项目。在某些系统上,此方法可能引发NotImplementedError异常。

q.empty() :如果调用此方法时 q为空,返回True。如果其他进程或线程正在往队列中添加项目,结果是不可靠的。也就是说,在返回和使用结果之间,队列中可能已经加入新的项目。

q.full() :如果q已满,返回为True. 由于线程的存在,结果也可能是不可靠的(参考q.empty()方法)。
在这里插入图片描述
就比如,进程1所得到的结果,要在进程2、3、4等进程当中用,此时,可以通过Queue,让其他进程来获得进程1中的结果。
现在,我们有一个场景,在一个进程当中,计算出两个数的和,然后在另外一个进程中使用第一个进程中计算的结果,除以2,即得到这两个数的平均值,代码如下:

from multiprocessing import Process,Queue
class AddProc(Process):def __init__(self,q,number1,number2):super(AddProc, self).__init__()self.number1 = number1self.number2 = number2self.q=qdef run(self):res = self.number1 + self.number2self.q.put(res)print("相加进程1:",res)
class DiviSion(Process):def __init__(self,q):super(DiviSion, self).__init__()self.q = qdef run(self):res = self.q.get()/2print("除2进程2:",res)if __name__ == '__main__':print("主进程开始")q = Queue()p1 = AddProc(q,12,13)p2 = DiviSion(q)p1.start()p2.start()p1.join()p2.join()print("主进程结束!")

二、Pipe
在这里插入图片描述

管道通信,就是各个进程之间相互通信,有双工和半双工两种方式,默认为双工通信

同样,拿上面的案例,改用管道通信改写,就变成下面这个样子:

from multiprocessing import Process,Pipe
class AddProc(Process):def __init__(self,pi1,number1,number2):super(AddProc, self).__init__()self.number1 = number1self.number2 = number2self.pi1=pi1def run(self):res = self.number1 + self.number2self.pi1.send(res)print("相加进程1:",res)class DiviSion(Process):def __init__(self,pi2):super(DiviSion, self).__init__()self.pi2 = pi2def run(self):res = self.pi2.recv()/2print("除2进程2:",res)
if __name__ == '__main__':pi1,pi2=Pipe()print("主进程开始")p1 = AddProc(pi1,12,13)p2 = DiviSion(pi2)p1.start()p2.start()p1.join()p2.join()print("主进程结束!")

p1,p2=Pipe():Pipe创建之后得到管道的两端
self.pi1.send() :write进程负责把数据通过管道发送给另一个进程
self.pi2.recv():当管道中没有数据,该行代码一直阻塞
recv函数是阻塞函数

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...