python提供了多种进程通信

提供了多种进程通信
一般来说进程之间是并行的,在实际的工程中时,常常是两个进程之间是有一定关系的,比如我现在需要完成任务一(进程1——>进程2进行加工和处理),所以必须然后让进程之间通信,此时我们必须要搭建一个桥梁,这个时候我就需要用到数据结构,队列 。
再比如博主做的项目中,语音播报模块需要等目标检测模块中的值,这个时候我们应该怎么办呢?这里就涉及到进程的通信 。提供了多种进程通信的方式,主要Queue和Pipe这两种方式,Queue用于多个进程间实现通信,Pipe是两个进程的通信 。
Queue有两个方法:

python提供了多种进程通信

文章插图
from multiprocessing import Process, Queue, set_start_methodimport time,random,os#创建队列,容量为3q=Queue(3)q.put(1)q.put(2)q.put(3)q.put(4,timeout=3)#一直没执行,意思是等待3秒 。
from multiprocessing import Process, Queue, set_start_methodimport time,random,os#创建队列,容量为3q=Queue(3)q.put(1)q.put(2)q.put(3)print(q.qsize())while True:if not q.empty():print(q.get())else:print("该队列已为空")break
举个栗子:
比如现在我有一个任务是下载音乐然后保存音乐:
from multiprocessing import Process, Queue, set_start_methodimport time,random,os#下载音乐def load_music(q):music_list=["1","2","3","4","5"]for i in music_list:print('正在下载<{}>音乐'.format(i))q.put(i)#把下载好的音乐存入队列#保存音乐def save_music(q):while True:if not q.empty():print('把<{}>音乐存入D盘'.format(q.get()))else:print("该队列已为空")breakif __name__ == '__main__':q=Queue(4)p1 = Process(target=load_music,name='目标检测',args=(q,))p2 = Process(target=save_music,name='保存音乐',args=(q,))#启动子进程,写入p1.start()p2.start()
再举一个我项目中的例子:
【python提供了多种进程通信】from multiprocessing import Process, Queue, set_start_methodimport time,random,os#目标检测def load(q1,q2):state_list=["red","green"]dis_list=["1", "2", "3", "4", "5"]for i in state_list:print('检测当前的状态<{}>'.format(i))q1.put(i)#把当前的状态存入队列for i in dis_list:print('检测当前的距离<{}>'.format(i))q2.put(i)#把当前的状态存入队列#语音播报def save(q1,q2):while True:if not q1.empty():print('把状态<{}>语音播报'.format(q1.get()))else:print("该队列已为空")breakwhile True:if not q2.empty():print('把距离<{}>语音播报'.format(q2.get()))else:print("该队列已为空")breakif __name__ == '__main__':q1=Queue(2)q2=Queue(5)p1 = Process(target=load,name='目标检测',args=(q1,q2,))p2 = Process(target=save,name='语音播报',args=(q1,q2,))#启动子进程,写入p1.start()p2.start()