multiprocessing.Queue()和queue.Queue()的區別
阿新 • • 發佈:2018-12-30
1.from queue import Queue
這個是普通的佇列模式,類似於普通列表,先進先出模式,get方法會阻塞請求,直到有資料get出來為止
這個是多程序併發的Queue佇列,用於解決多程序間的通訊問題。普通Queue實現不了。例如來跑多程序對一批IP列表進行運算,運算後的結果都存到Queue佇列裡面,這個就必須使用multiprocessing提供的Queue來實現
#child ---child process commucation
from multiprocessing import Process,Queue
import os,time,random
def write(q):
for value in ['a','b','c']:
print('put %s to queue..' % value)
q.put(value)
time.sleep(random.random())
def read(q):
while True:
if not q.empty():
value = q.get()
print('get %s from queue' % value)
time.sleep(random.random())
else:
break
if __name__ == '__main__':
q = Queue()
pw = Process(target=write, args=(q,))
pr = Process(target=read, args=(q,))
pw.start()
pr.start()
pw.join()
pr.join()
print('all datas have been writen and been read')
如果是用程序池,那麼就需要使用Manager().Queue()佇列才能在各子程序間通訊,否則沒用
p = Pool()
q = Manager().Queue()
pw = p.apply_async(write,args=(q,))
time.sleep(0.5)
pr = p.apply_async(read,args=(q,))
p.close()
p.join()
print('all datas have been writen and been read')
如果要在manger().Queue()中使用鎖,就要
manager = Manager()
q = manager.Queue()
lock = manager.Lock() #鎖的獲取和釋放都一樣
參考自:https://my.oschina.net/yangyanxing/blog/296052