首页 > 解决方案 > Python Queue 如何知道它将为空?

问题描述

我想了解队列如何知道它不会收到任何新项目。在下面的示例中,当tputter线程未启动时,队列将无限等待(我假设是因为到目前为止没有放入任何内容)。如果tputter启动,它会在“放置”之间等待,直到有新的东西出现,一旦一切完成,它就会停止。但是如何tgetter知道新的东西是否会出现在队列中呢?

import threading
import queue
import time

q = queue.Queue()

def getter():
    for i in range(5):
        print('worker:', q.get())
        time.sleep(2)


def putter():
    for i in range(5):
        print('putter: ', i)
        q.put(i)
        time.sleep(3)

tgetter = threading.Thread(target=getter)
tgetter.start()
tputter = threading.Thread(target=putter)
#tputter.start()

标签: pythonqueuepython-multithreading

解决方案


一种常见的方法是使用“毒丸”模式。基本上,生产者和消费者就一个特殊的“毒丸”对象达成一致,生产者可以将其加载到队列中,这将表明不再发送项目,消费者可以关闭。

因此,在您的示例中,它看起来像这样:

import threading
import queue
import time

q = queue.Queue()
END = object()

def getter():
    while True:
        item = q.get()
        if item == END:
           break
        print('worker:', item)
        time.sleep(2)


def putter():
    for i in range(5):
        print('putter: ', i)
        q.put(i)
        time.sleep(3)
    q.put(END)

tgetter = threading.Thread(target=getter)
tgetter.start()
tputter = threading.Thread(target=putter)
#tputter.start()

这有点做作,因为生产者被硬编码为总是发送五个项目,所以你必须想象消费者不提前知道生产者将发送多少个项目。


推荐阅读