python - 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()
解决方案
一种常见的方法是使用“毒丸”模式。基本上,生产者和消费者就一个特殊的“毒丸”对象达成一致,生产者可以将其加载到队列中,这将表明不再发送项目,消费者可以关闭。
因此,在您的示例中,它看起来像这样:
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()
这有点做作,因为生产者被硬编码为总是发送五个项目,所以你必须想象消费者不提前知道生产者将发送多少个项目。
推荐阅读
- freemarker - 在freemarker中获取原始格式的序列
- html - 当 div 调整大小时 sup 标签元素向下,但我希望它只保持向上
- opengl - 在 GLSL 和 C++ 中的 OpenGL 中使用 2D PNG 的 3D 查找表
- python - 如何防止 i 递增,直到我的 Python 程序的 csv 文件中有一个适用的值?
- flutter - 颤振:无法调用提供者
.of(context) 来自定义到另一个文件中的函数。ProviderNotFoundException - javascript - 单击不同html页面上的按钮时如何添加css样式更改?
- mongodb - MongoDB $near 和 $geoNear 提供的位置与真实位置存在巨大差异
- java - 客户端需要哪些 SSL 工件用于 java 中的相互握手
- c++ - boost 中是否有 std::sample 等效项?
- android - 如何从firebase获取电话号码