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()
这有点做作,因为生产者被硬编码为总是发送五个项目,所以你必须想象消费者提前不知道生产者将发送多少项目。
我想了解队列如何知道它不会收到任何新项目。在下面的示例中,当 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()
这有点做作,因为生产者被硬编码为总是发送五个项目,所以你必须想象消费者提前不知道生产者将发送多少项目。