2017-10-14 65 views
0

我正在做一些線程過期,並注意到我的代碼工作即使沒有q.task_done()語句。隊列如何知道一個線程沒有指定task_done()?

import Queue, threading 

queue = Queue.Queue() 

def get_url(url): 
    queue.put({url: len(urllib2.urlopen(url).read())}) 

def read_from_queue(): 
    m = queue.get() 
    print m.items() 
    queue.task_done() # <-- this can be removed and still works 

def use_threads(): 
    threads = [] 
    for u in urls: 
     t = threading.Thread(target=get_url, args=(u,)) 
     threads.append(t) 
     t.start() 

    for t in threads: 
     t.join() 

    threads = [] 
    for r in urls: 
     t = threading.Thread(target=read_from_queue) 
     threads.append(t) 
     t.start() 

    for t in threads: 
     t.join() 

這是一個簡單的程序,遍歷的URL列表,閱讀其內容,並概括起來,以字節LEN。然後在隊列中放入一個包含url名稱和大小的字典。

我有timeit.timeit測試了兩種情況;結果是混合的,但這是有道理的,因爲大部分工作發生在網絡上。

如何隊列知道一個任務完成? t.join()如何在隊列上調用時不返回task_done()

回答

3

queue.task_done隻影響queue.join

queue.task_done不影響thread.join

要調用thread.join,從不叫queue.join,所以queue.task_done不要緊

+0

我剛剛在文檔上閱讀它,更新了我的答案。做一些測試,你可能是正確的,我'加入'線程而不是隊列。 – Vinny

0

臧明傑是正確的。我是join()的線程,而不是隊列本身。 線程完成後,join()返回。

這一塊我失蹤:

task_done()整體思路是當線程是守護進程,或從不返回直到被殺死。那麼你不能線程join(),因爲它會死鎖。

所以,當你有這樣的場景 - 你join()的隊列。這將在隊列中沒有任務時返回(指示當前沒有更多工作)。

相關問題