python线程停止写入输出队列
问题描述:
我有一个线程从输入队列中读取数据,对它执行某些操作,然后将结果放到输出队列中以供以后使用。但是,它看起来像线程只能写入输出队列一次。我究竟做错了什么?以下是我的代码的高度简化的自包含版本。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
“结果”仅印刷一次,但我希望它为每个输入被打印多次,一次。
答
当你在你的线程上调用start
时,它开始执行你传递给它的函数。在这种情况下,你可以调用你的队列的get方法来阻塞你的线程,直到你的输入队列至少有一个元素。只要您的输入队列有一个元素,您的函数就会继续执行并将第一个输入放入输出队列中。但是,请注意,一旦此操作完成一次,您的函数将返回并因此您的线程退出。
为了让你的线程反复查询你的输入队列的输入,你应该花一些时间把你的功能包装到开头。例如
while True:
input_number = input_queue.get()
output_number = input_number ** 2
input_queue.task_done()
output_queue.put(output_number)
在这种情况下,一个单一的元素进行查询后,处理并放置到输出队列,您的工作线程将等待新的输入元素出现在你的输入队列。一旦有元素,它将再次执行相同的处理步骤。
你需要用'do_work()'在某种循环中包装代码。否则,它会执行一次然后返回,这会导致线程退出。 – 2017-10-29 04:10:07