我有一个线程,它从输入队列中读取数据,对其执行某些操作,然后将结果放在输出队列中以便稍后使用。但是,看起来线程只能写入输出队列一次。我究竟做错了什么?以下是我的代码的高度简化的自包含版本。
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 :(得分:2)
当您在线程上调用start
时,它会开始执行您传递给它的函数。在这种情况下,您调用队列的get方法来阻塞您的线程,直到您的输入队列至少有一个元素。只要输入队列有一个元素,函数就会继续执行并将第一个输入放入输出队列。但请注意,一旦完成此操作,您的函数将返回,因此您的线程将退出。
要让您的线程重复查询输入队列以获取输入,您应该花一些时间将您的函数包装到开头。例如
while True:
input_number = input_queue.get()
output_number = input_number ** 2
input_queue.task_done()
output_queue.put(output_number)
在这种情况下,在查询,处理并放入输出队列的单个元素之后,工作线程将等待新的输入元素出现在输入队列中。一旦有元素,它将再次执行相同的处理步骤。