最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于生產(chǎn)消費(fèi)者模型中task_done()的具體作用

 更新時(shí)間:2023年02月25日 09:41:26   作者:MicoJack?Honey  
這篇文章主要介紹了關(guān)于生產(chǎn)消費(fèi)者模型中task_done()的具體作用,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

直奔主題

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é)束。

對比解釋看效果

注釋掉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é)束。

總結(jié)

通過以上分析可以得出結(jié)論:

task_done()的作用:消費(fèi)者處理一個(gè)任務(wù),它就通知生產(chǎn)者我處理了一個(gè)任務(wù)。

為什么要告訴生產(chǎn)者消費(fèi)者處理了一個(gè)任務(wù)呢?

這也是為什么我進(jìn)行注釋對比的原因

  • 1.注釋q.task_done(),不注釋q.join(),我們發(fā)現(xiàn)produce函數(shù)一直阻塞沒有結(jié)束。
  • 2.注釋q.task_done(),注釋q.join(),我們發(fā)現(xiàn)生產(chǎn)者生產(chǎn)完任務(wù)produce函數(shù)就結(jié)束了,而不是等到消費(fèi)者消費(fèi)完才結(jié)束。這沒有task_done和join:這個(gè)模型一定是生產(chǎn)者先生產(chǎn)任務(wù),消費(fèi)者發(fā)現(xiàn)有任務(wù)就消費(fèi)(不然會(huì)阻塞等待),所以一定是生產(chǎn)者生產(chǎn)完后就馬上結(jié)束生產(chǎn)而消費(fèi)者還沒有結(jié)束。
  • 3.不注釋q.task_done(),不注釋q.join(),我們發(fā)現(xiàn)produce函數(shù)在消費(fèi)者消費(fèi)完后才結(jié)束,而不是生產(chǎn)完就結(jié)束。

生產(chǎn)者如果被消費(fèi)者的task_done()告知沒有把生產(chǎn)者交給的任務(wù)處理完畢,那么生產(chǎn)者就會(huì)一直阻塞(生氣…)。

大家可以把sleep()函數(shù)的注釋刪掉看看,并且設(shè)置任意一個(gè)sleep()時(shí)間觀察現(xiàn)象。

如果只有q.join()而沒有task_done(),消費(fèi)者處理完所有任務(wù),生產(chǎn)者任然阻塞,所以q.join()一般和q.task_done()配合使用。

最后

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python實(shí)現(xiàn)TOPSIS分析法的示例代碼

    Python實(shí)現(xiàn)TOPSIS分析法的示例代碼

    TOPSIS法是一種常用的綜合評價(jià)方法,其能充分利用原始數(shù)據(jù)的信息,其結(jié)果能精確反應(yīng)各評價(jià)方案之間的差距。本文將利用Python實(shí)現(xiàn)這一方法,感興趣的可以了解一下
    2023-02-02
  • 利用Python計(jì)算圓周率π的實(shí)例代碼

    利用Python計(jì)算圓周率π的實(shí)例代碼

    圓周率沒有精確的計(jì)算公式,所以只能用近似的方式計(jì)算它的近似值。這篇文章主要介紹了利用Python計(jì)算圓周率π的相關(guān)資料,需要的朋友可以參考下
    2021-05-05
  • Python+Turtle繪制幸運(yùn)草的示例代碼

    Python+Turtle繪制幸運(yùn)草的示例代碼

    幸運(yùn)草又名四葉草,一般指四葉的苜蓿、或車軸草。在十萬株苜蓿草中,你可能只會(huì)發(fā)現(xiàn)一株是四葉草,機(jī)會(huì)率大約是十萬分之一。本文主要介紹運(yùn)用turtle庫控制函數(shù)繪制四葉草,希望見者皆好運(yùn)
    2022-06-06
  • matplotlib 向任意位置添加一個(gè)子圖(axes)

    matplotlib 向任意位置添加一個(gè)子圖(axes)

    這篇文章主要介紹了matplotlib 向任意位置添加一個(gè)子圖(axes),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • python安裝whl文件的實(shí)戰(zhàn)步驟

    python安裝whl文件的實(shí)戰(zhàn)步驟

    whl格式本質(zhì)上是一個(gè)壓縮包,里面包含了py文件,以及經(jīng)過編譯的pyd文件,下面這篇文章主要給大家介紹了關(guān)于python安裝whl文件的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • python中列表元素連接方法join用法實(shí)例

    python中列表元素連接方法join用法實(shí)例

    這篇文章主要介紹了python中列表元素連接方法join用法,實(shí)例分析了Python中join方法的使用技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-04-04
  • OpenCV MediaPipe實(shí)現(xiàn)顏值打分功能

    OpenCV MediaPipe實(shí)現(xiàn)顏值打分功能

    這篇文章主要介紹了通過OpenCV MediaPipe實(shí)現(xiàn)攝像頭實(shí)時(shí)檢測顏值打分功能,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Python有一定的幫助,感興趣的可以了解一下
    2021-12-12
  • python多個(gè)字符串條件分割split方式

    python多個(gè)字符串條件分割split方式

    這篇文章主要介紹了python多個(gè)字符串條件分割split方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • python具名元組(namedtuple)的具體使用

    python具名元組(namedtuple)的具體使用

    本文主要介紹了python具名元組(namedtuple)的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • python創(chuàng)建文件時(shí)去掉非法字符的方法

    python創(chuàng)建文件時(shí)去掉非法字符的方法

    今天小編就為大家分享一篇python創(chuàng)建文件時(shí)去掉非法字符的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10

最新評論

岳阳市| 惠州市| 萨嘎县| 望江县| 上杭县| 胶州市| 曲阜市| 广南县| 聂拉木县| 容城县| 南宫市| 丰台区| 崇礼县| 山西省| 咸丰县| 巴东县| 工布江达县| 东安县| 泾源县| 中阳县| 穆棱市| 铜川市| 和平县| 东兴市| 微博| 石渠县| 济南市| 邵阳县| 丹凤县| 耿马| 轮台县| 神农架林区| 灵丘县| 德令哈市| 镇安县| 涟水县| 玛纳斯县| 乌恰县| 阜平县| 济源市| 岳西县|