JoinableQueue比Queue多了task_done和join方法
from multiprocessing import JoinableQueue, Queue # 用法和Queue相似 q = JoinableQueue() q.put("ocean") # 隊列放入一個任務,內存在一個計數機制,+1 # q.put("can") # 計數機制+1 print(q.get()) q.task_done() # 完成一次任務,計數機制-1 q.join() # 計數機制不為0的時候,阻塞等待計數器為0后通過
執行結果:
ocean
接着再看一個Queue的例子
from multiprocessing import Process, Queue def producer(q): # 生產 for i in range(1, 6): q.put(i) # 添加一個任務 print("生產%s饅頭" % i) def consumer(q): # 消費 while 1: sth = q.get() print("消費%s饅頭" % sth) if __name__ == '__main__': q = Queue(4) p1 = Process(target=producer, args=(q, )) p2 = Process(target=producer, args=(q, )) p3 = Process(target=producer, args=(q, )) c1 = Process(target=consumer, args=(q, )) c2 = Process(target=consumer, args=(q, )) # 將消費者設置為守護進程,因為消費者里面是死循環 c1.daemon = True c2.daemon = True p1.start() p2.start() p3.start() c1.start() c2.start() p1.join() p2.join() p3.join() print("stop")
執行結果:
生產1饅頭
生產2饅頭
生產3饅頭
生產4饅頭
消費1饅頭
生產5饅頭
消費2饅頭
消費3饅頭
消費4饅頭
消費5饅頭
生產1饅頭
生產2饅頭
生產3饅頭
生產1饅頭
消費1饅頭
生產4饅頭
消費2饅頭
生產5饅頭
消費3饅頭
消費4饅頭
消費5饅頭
消費1饅頭
消費2饅頭
生產2饅頭
消費3饅頭
生產3饅頭
消費4饅頭
生產4饅頭
消費5饅頭
生產5饅頭
stop
把上面的程序改為JoinableQueue后的效果
ame__ == '__main__': # 繼承了Queue,多了兩個功能,join() task_done() q = JoinableQueue(4) p1 = Process(target=producer, args=(q, )) p2 = Process(target=producer, args=(q, )) p3 = Process(target=producer, args=(q, )) c1 = Process(target=consumer, args=(q, )) c2 = Process(target=consumer, args=(q, )) # 將消費者設置為守護進程,因為消費者里面是死循環 c1.daemon = True c2.daemon = True p1.start() p2.start() p3.start() c1.start() c2.start() p1.join() p2.join() p3.join() print("stop")
執行結果:
生產1饅頭
生產1饅頭
生產1饅頭
消費1饅頭
task_done一次
消費1饅頭
task_done一次
消費1饅頭
task_done一次
所有連接結束join一次
所有連接結束join一次
所有連接結束join一次
生產2饅頭
生產2饅頭
生產2饅頭
消費2饅頭
task_done一次
消費2饅頭
task_done一次
消費2饅頭
task_done一次
所有連接結束join一次
所有連接結束join一次
所有連接結束join一次
生產3饅頭
生產3饅頭
生產3饅頭
消費3饅頭
task_done一次
消費3饅頭
task_done一次
消費3饅頭
task_done一次
所有連接結束join一次
所有連接結束join一次
所有連接結束join一次
生產4饅頭
生產4饅頭
生產4饅頭
消費4饅頭
task_done一次
消費4饅頭
task_done一次
消費4饅頭
task_done一次
所有連接結束join一次
所有連接結束join一次
所有連接結束join一次
生產5饅頭
生產5饅頭
生產5饅頭
消費5饅頭
task_done一次
消費5饅頭
task_done一次
消費5饅頭
task_done一次
所有連接結束join一次
所有連接結束join一次
所有連接結束join一次
stop
q.task_done() 使用者使用此方法發出信號,表示q.get()返回的項目已經被處理。也就是put取出了,計數-1。
q.join() 生產者將使用此方法進行阻塞,直到隊列中所有項目均被處理。阻塞將持續到為隊列中的每個項目均調用q.task_done()方法為止。