可以使⽤multiprocessing模块的Queue实现多进程之间的数据传递,
Queue本身是⼀个消息列队程序
因为进程之间相互不能影响
为了使进程间可以通信
队列便是完成进程间通信的任务
创建队列
放入队列的时候是放在队尾,取出队列的时候是从队首取
进程间的通信
import multiprocessing
import time
def write_queue(queue1):
i=0
while True:
i+=1
if queue1.full(): # 判断队列是否满
print('队列已经满了')
return
queue1.put(i)
print('写入了',i)
time.sleep(0.5) #
def read_queue(queue1):
while True:
if queue1.empty(): # 判断队列是否空
print('队列已经空了')
return
value=queue1.get()
print('读取了:',value)
if __name__ == '__main__':
queue1=multiprocessing.Queue(5)
p1=multiprocessing.Process(target=write_queue,args=(queue1,))
p2=multiprocessing.Process(target=read_queue,args=(queue1,))
p1.start()
p1.join() #让p1先执行完再执行p2
p2.start()
## 进程池间的通信
import multiprocessing
import time
def write_queue(queue1):
i=0
while True:
i+=1
if queue1.full():
print('队列已经满了')
return
queue1.put(i)
print('写入了',i)
time.sleep(0.5)
def read_queue(queue1):
while True:
if queue1.empty():
print('队列已经空了')
return
value=queue1.get()
print('读取了:',value)
if __name__ == '__main__':
my_pool=multiprocessing.Pool(2) #创建一个进程池,包含两个进程
queue1=multiprocessing.Manager().Queue(5) #创建一个进程池队列
result=my_pool.apply_async(write_queue,(queue1,)) #进程池中使用异步的方式
result.wait() #让这个进程优先执行。同步方式下,不需要写。因为在此代码中,判断了队列空时退出,所以异步需要写,否则异步方式下无序运行,当读取读完了而写没有完成,读取就不执行了
my_pool.apply_async(read_queue,(queue1,)) #进程池中使用异步的方式
my_pool.close() #进程池不再接收新的任务。同步的时候不需要写,是因为异步无序,同步有序
my_pool.join() #让主进程阻塞,主进程等待进程池执行完毕再结束。同步不需要写是因为当主进程发现一个进程结束后便立刻结束,而同步是按顺序来执行这两个进程的,执行完这两个进程后,主进程才发现并且结束;
# 而异步的时候,两个进程独立且无序,当一个进程完成后,主进程立刻发现并结束,此时还有一个进程没有执行完成,所以需要主进程等待进程池整体结束后再结束。