亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

python中queue.Queue之task_done的用法

 更新時間:2024年02月23日 10:45:57   作者:碧落&凡塵  
這篇文章主要介紹了python中queue.Queue之task_done的用法,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

queue.Queue之task_done用法

from threading import Thread
import time
from queue import Queue
q = Queue()
def run():
    while True:
        msg = q.get()
        print(msg)
        time.sleep(1)
        q.task_done()
 
 
for i in range(10):
    q.put(5-i)
 
for i in range(3):
    t = Thread(target=run)
    t.setDaemon(True)
    t.start()
q.join()

task_done目的是為了告訴隊列, 我當前已經(jīng)獲取到隊列中的內(nèi)容, 當隊列獲取到所有線程中的此信號時, 會去會首先會不斷檢測是否有地方正在獲取消息內(nèi)容, 檢測到后會繼續(xù)檢測隊列中是否還有消息, 若有, 則會分發(fā)消息給get的地方, 如果沒有, 則會終端join帶來的阻塞, 繼續(xù)往下執(zhí)行。

如果沒有檢測到有地方正在get到消息的話, 隊列會不斷的做這個檢測, 從而阻塞在join那里, 也就是說, 如果在上述while True中加入了break語句, 導(dǎo)致所有線程不再get隊列消息(實際線程已結(jié)束), 那么隊列將會一直阻塞在join的地方

Queue.queue 退出與阻塞

#-*-coding:utf-8-*-
import threading
import queue
import time
import random
 
'''
1.創(chuàng)建一個 Queue.Queue() 的實例,然后使用數(shù)據(jù)對它進行填充。
2.將經(jīng)過填充數(shù)據(jù)的實例傳遞給線程類,后者是通過繼承 threading.Thread 的方式創(chuàng)建的。
3.每次從隊列中取出一個項目,并使用該線程中的數(shù)據(jù)和 run 方法以執(zhí)行相應(yīng)的工作。
4.在完成這項工作之后,使用 queue.task_done() 函數(shù)向任務(wù)已經(jīng)完成的隊列發(fā)送一個信號。
5.對隊列執(zhí)行 join 操作,實際上意味著等到隊列為空,再退出主程序。
'''
 
class jdThread(threading.Thread):
    def __init__(self,index,queue):
        threading.Thread.__init__(self)
        self.index = index
        self.queue = queue
 
    def run(self):
        while True:
            time.sleep(1)
            item = self.queue.get(False,)
            if self.queue.empty():
                print("here")
                break
 
            print("序號:",self.index,"任務(wù)",item,"完成")
            self.queue.task_done()#task_done方法使得未完成的任務(wù)數(shù)量-1
 
if __name__ == '__main__':
 
    q = queue.Queue(0)
 
    for i in range(6):
        print ("the  i is :%d" % i)
        q.put(i)#put方法使得未完成的任務(wù)數(shù)量+1
 
    '''
    初始化函數(shù)接受一個數(shù)字來作為該隊列的容量,如果傳遞的是
    一個小于等于0的數(shù),那么默認會認為該隊列的容量是無限的.
    '''
    for i in range(2):
        jdThread(i,q).start()#兩個線程同時完成任務(wù)
 
print ("I am here ")

Queue.get()默認的也是阻塞方式讀取數(shù)據(jù),隊列為空時,不會拋出 except Queue.Empty ,而是進入阻塞直至超時。 加上block=False 的參數(shù), 線程會以拋出異常的方式退出,從而進程也可退出。

Queue.put 跟Queue.get()類似, Queue.put()默認有 block = True 和 timeou 兩個參數(shù)。當 block = True 時,寫入是阻塞式的,阻塞時間由 timeou 確定。當隊列q被(其他線程)寫滿后,這段代碼就會阻塞,直至其他線程取走數(shù)據(jù)。Queue.put()方法加上 block=False 的參數(shù),為非阻塞方式寫隊列,當隊列滿時會拋出 exception Queue.Full 的異常。

總結(jié)

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

相關(guān)文章

最新評論