2015-11-28 58 views
3

我有一個程序有兩個線程,主線程和一個處理來自FIFO隊列的作業的附加程序。 事情是這樣的:如何在退出主線程之前確保隊列爲空

import queue 
import threading 

q = queue.Queue() 

def _worker(): 
    while True: 
     msg = q.get(block=True) 
     print(msg) 
     q.task_done() 

t = threading.Thread(target=_worker) 
#t.daemon = True 
t.start() 

q.put('asdf-1') 
q.put('asdf-2') 
q.put('asdf-4') 
q.put('asdf-4') 

我想做到的是基本上以確保隊列主線程退出之前清空。 如果我將t.daemon設置爲True,程序將在隊列清空之前退出,但如果設置爲False,程序將永遠不會退出。有什麼方法可以確保運行_worker()方法的線程清除主線程出口上的隊列嗎?

+0

我不是一個併發編程專家,但可能需要在程序結束時添加't.join()',以使主線程等待't'完成執行。 – ozgur

+0

@ozgur:線程永遠不會終止,無限循環..所以使用連接將無法工作 - https://docs.python.org/2/library/threading.html#threading.Thread.join – Niklas9

+0

你爲什麼打電話'q.get'上的'block = True'?即使隊列被清空,它也不會退出。 – ozgur

回答

1

該評論涉及使用.join(),但根據您的使用情況,使用連接可能會使線程無意義。

我假設你的主線程將做的事情不是將項目添加到隊列中 - 而是可能在任何時候關閉,你只是想在關閉完成之前確保你的隊列是空的。

在主線程結束時,您可以在循環中添加一個簡單的空檢查。

while not q.empty(): 
    sleep(1) 

如果您沒有設置t.daemon = True那麼線程將永遠不會結束。將線程設置爲守護線程將意味着線程不會導致程序在主線程完成時保持運行狀態。

相關問題