Python 队列如何知道它将为空?

How does Python Queue know it will be empty?

我想了解队列如何知道它不会收到任何新项目。在下面的示例中,当 tputter 线程未启动时,队列将无限期地等待(我假设因为到目前为止没有任何内容)。如果 tputter 启动,它会在 'puts' 之间等待,直到有新的东西出现,一旦一切完成它就会停止。但是 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()

一种常用的方法是使用 "poison pill" 模式。基本上,生产者和消费者就一个特殊的 "poison pill" 对象达成一致,生产者可以将其加载到队列中,这将指示不再发送任何项目,并且消费者可以关闭。

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

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()

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