2017-10-29 66 views
0

我有一個線程從輸入隊列中讀取數據,對它執行某些操作,然後將結果放到輸出隊列中以供以後使用。但是,它看起來像線程只能寫入輸出隊列一次。我究竟做錯了什麼?以下是我的代碼的高度簡化的自包含版本。python線程停止寫入輸出隊列

import queue 
import threading 


def do_work(input_queue,output_queue): 
    input_number = input_queue.get() 
    output_number = input_number ** 2 
    input_queue.task_done() 
    output_queue.put(output_number) 

input_queue = queue.LifoQueue() 
output_queue = queue.LifoQueue() 

t = threading.Thread(name="Some thread", target=do_work, args=(input_queue,output_queue)) 
t.start() 
for i in range(1000): 
    input_queue.put(i) 
    if output_queue.empty(): 
     print('input: {0}'.format(i)) 
    else: 
     result = output_queue.get() 
     print('result: {0}'.format(result)) 
     output_queue.task_done() 

這導致下面的輸出:

input: 0 
result: 0 
input: 2 
input: 3 
input: 4 
... 
input: 999 

「結果」僅印刷一次,但我希望它爲每個輸入被打印多次,一次。

+0

你需要用'do_work()'在某種循環中包裝代碼。否則,它會執行一次然後返回,這會導致線程退出。 – 2017-10-29 04:10:07

回答

2

當你在你的線程上調用start時,它開始執行你傳遞給它的函數。在這種情況下,你可以調用你的隊列的get方法來阻塞你的線程,直到你的輸入隊列至少有一個元素。只要您的輸入隊列有一個元素,您的函數就會繼續執行並將第一個輸入放入輸出隊列中。但是,請注意,一旦此操作完成一次,您的函數將返回並因此您的線程退出。

爲了讓你的線程反覆查詢你的輸入隊列的輸入,你應該花一些時間把你的功能包裝到開頭。例如

while True: 
    input_number = input_queue.get() 
    output_number = input_number ** 2 
    input_queue.task_done() 
    output_queue.put(output_number) 

在這種情況下,一個單一的元素進行查詢後,處理並放置到輸出隊列,您的工作線程將等待新的輸入元素出現在你的輸入隊列。一旦有元素,它將再次執行相同的處理步驟。