網(wǎng)站首頁 編程語言 正文
直奔主題
tase_done()的作用:
只有消費者把隊列所有的數(shù)據(jù)處理完畢,queue.join()才會停止阻塞
代碼解釋
#關(guān)于tase_done()的作用:只有消費者把隊列所有的數(shù)據(jù)處理完畢,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('生產(chǎn):',i)
print('生產(chǎn)任務(wù)完畢!')
q.join()
print(produce.__name__,'函數(shù)結(jié)束!')
def consumer():
for i in range(10):
print('消費:', 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('消費者任務(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
消費: 0
消費: 1
消費: 2
消費: 3
消費: 4
消費: 5
生產(chǎn): 6
生產(chǎn): 7
生產(chǎn):8
消費: 6
消費: 7
消費: 8
生產(chǎn): 9
生產(chǎn)任務(wù)完畢!
消費: 9
consumer 函數(shù)結(jié)束!
produce 函數(shù)結(jié)束!
消費者任務(wù)完成
生產(chǎn)者任務(wù)完成
說明:生產(chǎn)任務(wù)已經(jīng)完畢為什么沒有直接produce函數(shù)結(jié)束?
說明這里產(chǎn)生了阻塞,產(chǎn)生阻塞的原因是因為消費者沒有處理完生產(chǎn)者所有任務(wù)。
tase_done()的作用:只有消費者把隊列所有的數(shù)據(jù)處理完畢,queue.join()才會停止阻塞所以才會有produce函數(shù)結(jié)束!然后生產(chǎn)任務(wù)結(jié)束。
對比解釋看效果
注釋掉q.task_done()和q.join()
#關(guān)于tase_done()的作用:只有消費者把隊列所有的數(shù)據(jù)處理完畢,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('生產(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('消費:', 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('消費者任務(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
消費: 0
消費: 1
生產(chǎn)任務(wù)完畢!
produce 函數(shù)結(jié)束!
消費: 2
消費: 3
消費: 4
消費: 5
消費: 6
消費: 7
消費: 8
消費: 9
consumer 函數(shù)結(jié)束!
消費者任務(wù)完成
生產(chǎn)者任務(wù)完成
說明:不帶task_done()和join()情況下生產(chǎn)任務(wù)結(jié)束,produce函數(shù)立刻結(jié)束,并沒有等待消費者處理完所有任務(wù)立即結(jié)束。
僅注釋掉q.task_done()**
#關(guān)于tase_done()的作用:只有消費者把隊列所有的數(shù)據(jù)處理完畢,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('生產(chǎn)任務(wù)完畢!')
q.join()
print(produce.__name__,'函數(shù)結(jié)束!')
def consumer():
for i in range(10):
print('消費:', 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('消費者任務(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ù)完畢!
消費: 0
消費: 1
消費: 2
消費: 3
消費: 4
消費: 5
消費: 6
消費: 7
消費: 8
消費: 9
consumer 函數(shù)結(jié)束!
消費者任務(wù)完成
。。。阻塞。。。
說明:消費者已經(jīng)把任務(wù)完成了,但是produce函數(shù)卻一直阻塞沒有結(jié)束。
總結(jié)
通過以上分析可以得出結(jié)論:
task_done()的作用:消費者處理一個任務(wù),它就通知生產(chǎn)者我處理了一個任務(wù)。
為什么要告訴生產(chǎn)者消費者處理了一個任務(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é)束了,而不是等到消費者消費完才結(jié)束。這沒有task_done和join:這個模型一定是生產(chǎn)者先生產(chǎn)任務(wù),消費者發(fā)現(xiàn)有任務(wù)就消費(不然會阻塞等待),所以一定是生產(chǎn)者生產(chǎn)完后就馬上結(jié)束生產(chǎn)而消費者還沒有結(jié)束。
- 3.不注釋q.task_done(),不注釋q.join(),我們發(fā)現(xiàn)produce函數(shù)在消費者消費完后才結(jié)束,而不是生產(chǎn)完就結(jié)束。
生產(chǎn)者如果被消費者的task_done()告知沒有把生產(chǎn)者交給的任務(wù)處理完畢,那么生產(chǎn)者就會一直阻塞(生氣…)。
大家可以把sleep()函數(shù)的注釋刪掉看看,并且設(shè)置任意一個sleep()時間觀察現(xiàn)象。
如果只有q.join()而沒有task_done(),消費者處理完所有任務(wù),生產(chǎn)者任然阻塞,所以q.join()一般和q.task_done()配合使用。
最后
原文鏈接:https://blog.csdn.net/qq_43577241/article/details/104442854
- 上一篇:沒有了
- 下一篇:沒有了
相關(guān)推薦
- 2023-07-02 Python?中的裝飾器實現(xiàn)函數(shù)的緩存(場景分析)_python
- 2023-07-10 Spring MVC 詳解(連接、獲取參數(shù)、返回數(shù)據(jù))
- 2022-09-20 RecyclerView實現(xiàn)側(cè)滑和網(wǎng)絡(luò)斷點續(xù)傳_Android
- 2022-09-22 在容器內(nèi)獲取 Pod 信息
- 2022-04-21 Android圖表庫HelloChart繪制多折線圖_Android
- 2022-06-06 web前端實現(xiàn)水平垂直居中、position、relative、absolute、transform
- 2023-12-08 Can‘t open the append-only file: Permission denied
- 2023-11-21 linux sudo:/etc/sudoers 中第 11 行附近有解析錯誤 sudo:no val
- 欄目分類
-
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支