multiprocessing中的Queue
首先我們知道漩怎,在各個(gè)進(jìn)程中,每個(gè)全局變量與局部變量是不能與其他進(jìn)程的通訊的擒悬,所以說這里可以通過消息隊(duì)列的方式完成進(jìn)程間的通訊榕茧。
代碼見下例子
#coding=utf-8
from multiprocessing import Queue,Process
import time
def write(que):
for value in ['A','B','C','D']:
que.put(value)
print('%s已經(jīng)被添加至que中'%value)
time.sleep(1)
def read(que):
for i in range(que.qsize()):
print(que.get()+'已被導(dǎo)出')
time.sleep(1)
if __name__ == '__main__':
que = Queue()
p1 = Process(target = write,args = (que,))
p1.start()
p1.join()
p2 = Process(target = read,args = (que,))
p2.start()
p2.join()
print('所有數(shù)據(jù)導(dǎo)出完畢')
執(zhí)行結(jié)果如下:
當(dāng)然這是在multiprocessing模塊中使用Process的結(jié)果。
multiprocessing中的Manager().Queue()#
如果考慮使用進(jìn)程池Pool的話诽偷,我們必須使用multiprocessing模塊中的Manager來創(chuàng)建消息隊(duì)列
代碼如下:
#coding=utf-8
from multiprocessing import Pool,Manager
import time,os
def write(que):
print('啟動(dòng)write進(jìn)程坤学,pid=%s,ppid=%s'%(os.getpid(),os.getppid()))
for i in ['A','B','C','D']:
que.put(i)
print('%s已經(jīng)添加至que中'%i)
time.sleep(1)
def read(que):
print('啟動(dòng)read進(jìn)程疯坤,pid=%s,ppid=%s'%(os.getpid(),os.getppid()))
for i in range(que.qsize()):
print(que.get()+'已被移除')
time.sleep(1)
if __name__ == '__main__':
po = Pool()
que = Manager().Queue()
po.apply(write,(que,))
po.apply(read,(que,))
po.close()
po.join()
print('主進(jìn)程%s結(jié)束'%os.getpid())
執(zhí)行結(jié)果如下:
Queue模塊中的Queue()
此部分介紹在Python同步文章中有介紹,詳細(xì)看那里