2017-10-29 176 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) 

在这种情况下,一个单一的元素进行查询后,处理并放置到输出队列,您的工作线程将等待新的输入元素出现在你的输入队列。一旦有元素,它将再次执行相同的处理步骤。