欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

關于生產消費者模型中task_done()的具體作用

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

直奔主題

tase_done()的作用:

只有消費者把隊列所有的數據處理完畢,queue.join()才會停止阻塞

代碼解釋

#關于tase_done()的作用:只有消費者把隊列所有的數據處理完畢,queue.join()才會停止阻塞
import time
from queue import Queue
from threading import Thread
q = Queue()

def produce():
    for i in range(10):
        q.put(i)
        print('生產:',i)
    print('生產任務完畢!')
    q.join()
    print(produce.__name__,'函數結束!')

def consumer():
    for i in range(10):
        print('消費:', q.get())
        q.task_done()
        # if i == 4:
        #     print('休息1s...')
        #     time.sleep(1)#sleep作用:查看生產者是否阻塞
    print(consumer.__name__,'函數結束!')



pro = Thread(target=produce)
con = Thread(target=consumer)

pro.start()
con.start()

con.join()
print('消費者任務完成')
pro.join()
print('生產者任務完成')

生產: 0
生產: 1
生產: 2
生產: 3
生產: 4
生產: 5
消費: 0
消費: 1
消費: 2
消費: 3
消費: 4
消費: 5
生產: 6
生產: 7
生產:8
消費: 6
消費: 7
消費: 8
生產: 9
生產任務完畢!
消費: 9
consumer 函數結束!
produce 函數結束!
消費者任務完成
生產者任務完成

說明:生產任務已經完畢為什么沒有直接produce函數結束?

說明這里產生了阻塞,產生阻塞的原因是因為消費者沒有處理完生產者所有任務。

tase_done()的作用:只有消費者把隊列所有的數據處理完畢,queue.join()才會停止阻塞所以才會有produce函數結束!然后生產任務結束。

對比解釋看效果

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

#關于tase_done()的作用:只有消費者把隊列所有的數據處理完畢,queue.join()才會停止阻塞
import time
from queue import Queue
from threading import Thread
q = Queue()

def produce():
    for i in range(10):
        q.put(i)
    print('生產任務完畢!')
    # q.join()
    # if i == 4:
        #     print('休息1s...')
        #     time.sleep(1)#sleep作用:查看生產者是否阻塞
    print(produce.__name__,'函數結束!')

def consumer():
    for i in range(10):
        print('消費:', q.get())
        # q.task_done()
    print(consumer.__name__,'函數結束!')



pro = Thread(target=produce)
con = Thread(target=consumer)

pro.start()
con.start()

con.join()
print('消費者任務完成')
pro.join()
print('生產者任務完成')

生產: 0
生產: 1
生產: 2
生產: 3
生產: 4
生產: 5
生產: 6
生產: 7
生產: 8
生產: 9
消費: 0
消費: 1
生產任務完畢!
produce 函數結束!
消費: 2
消費: 3
消費: 4
消費: 5
消費: 6
消費: 7
消費: 8
消費: 9
consumer 函數結束!
消費者任務完成
生產者任務完成

說明:不帶task_done()和join()情況下生產任務結束,produce函數立刻結束,并沒有等待消費者處理完所有任務立即結束。

僅注釋掉q.task_done()**

#關于tase_done()的作用:只有消費者把隊列所有的數據處理完畢,queue.join()才會停止阻塞
import time
from queue import Queue
from threading import Thread
q = Queue()

def produce():
    for i in range(10):
        q.put(i)
    print('生產任務完畢!')
    q.join()
    print(produce.__name__,'函數結束!')

def consumer():
    for i in range(10):
        print('消費:', q.get())
        # q.task_done()
        # if i == 4:
        #     print('休息1s...')
        #     time.sleep(1)#sleep作用:查看生產者是否阻塞
    print(consumer.__name__,'函數結束!')



pro = Thread(target=produce)
con = Thread(target=consumer)

pro.start()
con.start()

con.join()
print('消費者任務完成')
pro.join()
print('生產者任務完成')

生產: 0
生產: 1
生產: 2
生產: 3
生產: 4
生產: 5
生產: 6
生產: 7
生產: 8
生產: 9
生產任務完畢!
消費: 0
消費: 1
消費: 2
消費: 3
消費: 4
消費: 5
消費: 6
消費: 7
消費: 8
消費: 9
consumer 函數結束!
消費者任務完成
。。。阻塞。。。

說明:消費者已經把任務完成了,但是produce函數卻一直阻塞沒有結束。

總結

通過以上分析可以得出結論:

task_done()的作用:消費者處理一個任務,它就通知生產者我處理了一個任務。

為什么要告訴生產者消費者處理了一個任務呢?

這也是為什么我進行注釋對比的原因

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

生產者如果被消費者的task_done()告知沒有把生產者交給的任務處理完畢,那么生產者就會一直阻塞(生氣…)。

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

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

最后

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Python?hashlib模塊詳細講解使用方法

    Python?hashlib模塊詳細講解使用方法

    hashlib?是一個提供了一些流行的hash算法的?Python?標準庫.其中所包括的算法有?md5,?sha1,?sha224,?sha256,?sha384,?sha512.?另外,模塊中所定義的?new(name,?string=”)?方法可通過指定系統(tǒng)所支持的hash算法來構造相應的hash對象
    2022-11-11
  • 將Jupyter?Notebook(.ipynb)文件轉換為Python(.py)文件的3種方法

    將Jupyter?Notebook(.ipynb)文件轉換為Python(.py)文件的3種方法

    大多數數據科學在線課程都把Jupyter Notebook作為教學媒介,這是因為初學者在Jupyter Notebook的單元格中編寫代碼,比編寫包含類和函數的腳本更容易,這篇文章主要給大家介紹了關于將Jupyter?Notebook(.ipynb)文件轉換為Python(.py)文件的3種方法,需要的朋友可以參考下
    2023-10-10
  • python使用Matplotlib畫條形圖

    python使用Matplotlib畫條形圖

    這篇文章主要為大家詳細介紹了python使用Matplotlib畫條形圖,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • Python實現端口檢測的方法

    Python實現端口檢測的方法

    這篇文章主要介紹了Python實現端口檢測的方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-07-07
  • Python字符串本身作為bytes進行解碼的問題

    Python字符串本身作為bytes進行解碼的問題

    這篇文章主要介紹了解決Python字符串本身作為bytes進行解碼的問題,文末給大家補充介紹了,Python字符串如何轉為bytes對象?Python字符串和bytes類型怎么互轉,需要的朋友可以參考下
    2022-11-11
  • Python正則表達式如何進行字符串替換實例

    Python正則表達式如何進行字符串替換實例

    Python正則表達式在使用中會經常應用到字符串替換的代碼。這篇文章主要介紹了Python正則表達式如何進行字符串替換,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2016-12-12
  • Python 圖片轉數組,二進制互轉操作

    Python 圖片轉數組,二進制互轉操作

    這篇文章主要介紹了Python 圖片轉數組,二進制互轉操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • python中通過pip安裝庫文件時出現“EnvironmentError: [WinError 5] 拒絕訪問”的問題及解決方案

    python中通過pip安裝庫文件時出現“EnvironmentError: [WinError 5] 拒絕訪問”的問題

    這篇文章主要介紹了python中通過pip安裝庫文件時出現“EnvironmentError: [WinError 5] 拒絕訪問”的問題,本文給大家分享解決方案,感興趣的朋友跟隨小編一起看看吧
    2020-08-08
  • 詳解Python中Pytest和Unittest的區(qū)別

    詳解Python中Pytest和Unittest的區(qū)別

    Pytest?和?Unittest是Python中屬于最常用的兩個測試框架。那么他們有些什么區(qū)別呢??Playwright?為什么只給了Pytest的深度支持,而不是Unittest呢?本文就來和大家詳細聊聊
    2023-03-03
  • 在Python下嘗試多線程編程

    在Python下嘗試多線程編程

    這篇文章主要介紹了在Python下多線程編程的嘗試,由于GIL的存在,多線程在Python開發(fā)領域一直是個熱門問題,需要的朋友可以參考下
    2015-04-04

最新評論