python3 multiprocessing模塊下的Queue和JoinableQueue的區別


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()方法為止。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM