python 執行緒退出方法

2021-10-04 03:18:13 字數 1762 閱讀 3948

fifo是常用的佇列,其一些常用的方法有:

queue.qsize()  返回佇列大小

queue.empty()  判斷佇列是否為空

queue.full()  判斷佇列是否滿了

queue.get([block[,timeout]])  從佇列頭刪除並返回乙個item,block預設為true,表示當隊列為空卻去get的時候會阻塞執行緒,等待直到有有item出現為止來get出這個item。如果是false的話表明當隊列為空你卻去get的時候,會引發異常。在block為true的情況下可以再設定timeout引數。表示當隊列為空,get阻塞timeout指定的秒數之後還沒有get到的話就引發full異常。

queue.put(...[,block[,timeout]])  向隊尾插入乙個item,同樣若block=true的話佇列滿時就阻塞等待有空位出來再put,block=false時引發異常。同get的timeout,put的timeout是在block為true的時候進行超時設定的引數。

queue.task_done()  從場景上來說,處理完乙個get出來的item之後,呼叫task_done將向佇列發出乙個訊號,表示本任務已經完成

queue.join()  監視所有item並阻塞主線程,直到所有item都呼叫了task_done之後主線程才繼續向下執行。這麼做的好處在於,假如乙個執行緒開始處理最後乙個任務,它從任務佇列中拿走最後乙個任務,此時任務佇列就空了但最後那個執行緒還沒處理完。當呼叫了join之後,主線程就不會因為佇列空了而擅自結束,而是等待最後那個執行緒處理完成了。

執行緒退出可以設定標誌位,使用佇列獲取資料的執行緒可以將queue.get設定阻塞超時。

乙個簡單的由佇列獲取資料的執行緒的如何退出的例子:

import queue

import sys

import threading

def worker(name, q, exit_flag):

while not exit_flag.is_set():

try:

# 超時控制,便於及時響應exit_flag

item = q.get(timeout=3)

except queue.empty:

continue

print('thread {}, item {}'.format(name, item), file=sys.stderr)

q.task_done()

def main():

# 執行緒退出標誌位

exit_flag = threading.event()

exit_flag.clear()

# 建立共享佇列和執行緒池

q = queue.queue()

num_of_threads = 5

threads = [threading.thread(target=worker, args=(str(i+1), q, exit_flag))

for i in range(num_of_threads)]

for t in threads:

t.start()

for i in range(50):

q.put(i)

q.join()

# 任務處理完成,通知執行緒退出,並join等待

exit_flag.set()

for t in threads:

t.join()

if __name__ == '__main__':

main()

執行緒退出方法

執行緒停止方法 1.stop 不推薦使用 2.使用interrupt 退出執行緒,再根據interrupted 或者isinterrupted 來判斷是否執行緒狀態為停止,return與拋異常來推出執行緒 3.在睡眠中退出執行緒 thread.sleep 在interrupt 退出執行緒,會報錯,退...

Python 子執行緒退出孫執行緒不退出

遇到了乙個大坑!如圖,在子執行緒threadfunc退出之後,threadfunc2依舊在執行。根本不會結束 但是官方文件中說明了,只要設定了daemon不為none 就能設定子執行緒是守護執行緒,這樣執行緒退出的時候,子執行緒也會退出 如果不是 none,daemon 引數將顯式地設定該執行緒是否...

Python執行緒退出控制

ctypes模組控制線程退出 python中threading模組並沒有設計執行緒退出的機制,原因是不正常的執行緒退出可能會引發意想不到的後果。例如 執行緒正在持有乙個必須正確釋放的關鍵資源,鎖。執行緒建立的子執行緒,同時也將被殺掉。管理自己的執行緒,最好的處理方式是擁有乙個請求退出標誌,這樣每個執...