python线程停止写入输出队列

时间:2017-10-29 03:53:12

标签: python multithreading queue

我有一个线程,它从输入队列中读取数据,对其执行某些操作,然后将结果放在输出队列中以便稍后使用。但是,看起来线程只能写入输出队列一次。我究竟做错了什么?以下是我的代码的高度简化的自包含版本。

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

“结果”只打印一次,但我预计会多次打印,每次输入一次。

1 个答案:

答案 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)

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