溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

生產(chǎn)消費(fèi)者模型中的task_done()如何作用

發(fā)布時(shí)間:2023-02-25 10:33:51 來源:億速云 閱讀:115 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要講解了“生產(chǎn)消費(fèi)者模型中的task_done()如何作用”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“生產(chǎn)消費(fèi)者模型中的task_done()如何作用”吧!

    tase_done()的作用:

    只有消費(fèi)者把隊(duì)列所有的數(shù)據(jù)處理完畢,queue.join()才會(huì)停止阻塞

    代碼解釋

    #關(guān)于tase_done()的作用:只有消費(fèi)者把隊(duì)列所有的數(shù)據(jù)處理完畢,queue.join()才會(huì)停止阻塞
    import time
    from queue import Queue
    from threading import Thread
    q = Queue()
    
    def produce():
        for i in range(10):
            q.put(i)
            print('生產(chǎn):',i)
        print('生產(chǎn)任務(wù)完畢!')
        q.join()
        print(produce.__name__,'函數(shù)結(jié)束!')
    
    def consumer():
        for i in range(10):
            print('消費(fèi):', q.get())
            q.task_done()
            # if i == 4:
            #     print('休息1s...')
            #     time.sleep(1)#sleep作用:查看生產(chǎn)者是否阻塞
        print(consumer.__name__,'函數(shù)結(jié)束!')
    
    
    
    pro = Thread(target=produce)
    con = Thread(target=consumer)
    
    pro.start()
    con.start()
    
    con.join()
    print('消費(fèi)者任務(wù)完成')
    pro.join()
    print('生產(chǎn)者任務(wù)完成')

    生產(chǎn): 0
    生產(chǎn): 1
    生產(chǎn): 2
    生產(chǎn): 3
    生產(chǎn): 4
    生產(chǎn): 5
    消費(fèi): 0
    消費(fèi): 1
    消費(fèi): 2
    消費(fèi): 3
    消費(fèi): 4
    消費(fèi): 5
    生產(chǎn): 6
    生產(chǎn): 7
    生產(chǎn):8
    消費(fèi): 6
    消費(fèi): 7
    消費(fèi): 8
    生產(chǎn): 9
    生產(chǎn)任務(wù)完畢!
    消費(fèi): 9
    consumer 函數(shù)結(jié)束!
    produce 函數(shù)結(jié)束!
    消費(fèi)者任務(wù)完成
    生產(chǎn)者任務(wù)完成

    說明:生產(chǎn)任務(wù)已經(jīng)完畢為什么沒有直接produce函數(shù)結(jié)束?

    說明這里產(chǎn)生了阻塞,產(chǎn)生阻塞的原因是因?yàn)橄M(fèi)者沒有處理完生產(chǎn)者所有任務(wù)。

    tase_done()的作用:只有消費(fèi)者把隊(duì)列所有的數(shù)據(jù)處理完畢,queue.join()才會(huì)停止阻塞所以才會(huì)有produce函數(shù)結(jié)束!然后生產(chǎn)任務(wù)結(jié)束。

    對(duì)比解釋看效果

    注釋掉q.task_done()和q.join()

    #關(guān)于tase_done()的作用:只有消費(fèi)者把隊(duì)列所有的數(shù)據(jù)處理完畢,queue.join()才會(huì)停止阻塞
    import time
    from queue import Queue
    from threading import Thread
    q = Queue()
    
    def produce():
        for i in range(10):
            q.put(i)
        print('生產(chǎn)任務(wù)完畢!')
        # q.join()
        # if i == 4:
            #     print('休息1s...')
            #     time.sleep(1)#sleep作用:查看生產(chǎn)者是否阻塞
        print(produce.__name__,'函數(shù)結(jié)束!')
    
    def consumer():
        for i in range(10):
            print('消費(fèi):', q.get())
            # q.task_done()
        print(consumer.__name__,'函數(shù)結(jié)束!')
    
    
    
    pro = Thread(target=produce)
    con = Thread(target=consumer)
    
    pro.start()
    con.start()
    
    con.join()
    print('消費(fèi)者任務(wù)完成')
    pro.join()
    print('生產(chǎn)者任務(wù)完成')

    生產(chǎn): 0
    生產(chǎn): 1
    生產(chǎn): 2
    生產(chǎn): 3
    生產(chǎn): 4
    生產(chǎn): 5
    生產(chǎn): 6
    生產(chǎn): 7
    生產(chǎn): 8
    生產(chǎn): 9
    消費(fèi): 0
    消費(fèi): 1
    生產(chǎn)任務(wù)完畢!
    produce 函數(shù)結(jié)束!
    消費(fèi): 2
    消費(fèi): 3
    消費(fèi): 4
    消費(fèi): 5
    消費(fèi): 6
    消費(fèi): 7
    消費(fèi): 8
    消費(fèi): 9
    consumer 函數(shù)結(jié)束!
    消費(fèi)者任務(wù)完成
    生產(chǎn)者任務(wù)完成

    說明:不帶task_done()和join()情況下生產(chǎn)任務(wù)結(jié)束,produce函數(shù)立刻結(jié)束,并沒有等待消費(fèi)者處理完所有任務(wù)立即結(jié)束。

    僅注釋掉q.task_done()**

    #關(guān)于tase_done()的作用:只有消費(fèi)者把隊(duì)列所有的數(shù)據(jù)處理完畢,queue.join()才會(huì)停止阻塞
    import time
    from queue import Queue
    from threading import Thread
    q = Queue()
    
    def produce():
        for i in range(10):
            q.put(i)
        print('生產(chǎn)任務(wù)完畢!')
        q.join()
        print(produce.__name__,'函數(shù)結(jié)束!')
    
    def consumer():
        for i in range(10):
            print('消費(fèi):', q.get())
            # q.task_done()
            # if i == 4:
            #     print('休息1s...')
            #     time.sleep(1)#sleep作用:查看生產(chǎn)者是否阻塞
        print(consumer.__name__,'函數(shù)結(jié)束!')
    
    
    
    pro = Thread(target=produce)
    con = Thread(target=consumer)
    
    pro.start()
    con.start()
    
    con.join()
    print('消費(fèi)者任務(wù)完成')
    pro.join()
    print('生產(chǎn)者任務(wù)完成')

    生產(chǎn): 0
    生產(chǎn): 1
    生產(chǎn): 2
    生產(chǎn): 3
    生產(chǎn): 4
    生產(chǎn): 5
    生產(chǎn): 6
    生產(chǎn): 7
    生產(chǎn): 8
    生產(chǎn): 9
    生產(chǎn)任務(wù)完畢!
    消費(fèi): 0
    消費(fèi): 1
    消費(fèi): 2
    消費(fèi): 3
    消費(fèi): 4
    消費(fèi): 5
    消費(fèi): 6
    消費(fèi): 7
    消費(fèi): 8
    消費(fèi): 9
    consumer 函數(shù)結(jié)束!
    消費(fèi)者任務(wù)完成
    。。。阻塞。。。

    說明:消費(fèi)者已經(jīng)把任務(wù)完成了,但是produce函數(shù)卻一直阻塞沒有結(jié)束。

    感謝各位的閱讀,以上就是“生產(chǎn)消費(fèi)者模型中的task_done()如何作用”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)生產(chǎn)消費(fèi)者模型中的task_done()如何作用這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI