我正在使用python Queue存储要由线程处理的项目。从我在网上看到的,在队列中放入一个'None'对象并设置这样的线程处理将使线程停止。 (它确实如此)
for item in iter(queue.get, None):
#do stuff
queue.task_done()
现在我在网上找不到关于这种类型的for循环的很多信息。从我所看到它刚刚结束,并不会处理任何在队列中留下None对象的东西。 在末尾添加queue.task_done()不起作用。
有人可以向我解释一下这种类型的for循环。他们是如何命名的,他们如何在一般情况下工作,或指向我一些关于它的好文档,因为我找不到任何。
答案 0 :(得分:6)
这一行:
for item in iter(queue.get, None):
读取
"继续致电
queue.get
,然后运行循环体,直至queue.get() == None
答案 1 :(得分:4)
请参阅the documentation for the iter()
function:
如果给出第二个参数 sentinel ,则 o 必须是可调用对象。在这种情况下创建的迭代器将调用 o ,每次调用
next()
方法时都不带参数;如果返回的值等于 sentinel ,则会引发StopIteration
,否则将返回该值。
所以循环的行为等同于:
sentinel = None
while True:
item = queue.get()
if item == sentinel:
break
# do stuff
queue.task_done()
答案 2 :(得分:1)
这是iter()
的第二种形式:
iter(callable, sentinel) -> iterator
在第二种形式中,调用callable直到它返回sentinel。
(来自help(iter)
)。
因此,每次for语句尝试从iter
返回的迭代器中获取一个元素时,它会调用queue.get()
,检查是否返回非None,并将返回值作为item
传递给语句来体。当有人将None-terminator推送到队列时,queue.get()
返回None,导致迭代器抛出StopIteration
并且解释器留下for语句块。
答案 3 :(得分:0)
我认为这个问题是:
注意如果没有剩余元素并且没有放置任何标记值,这将阻止。
所以基本上这个方法不会自动在任何队列上运行,你必须放一个None
值来表示进程结束
答案 4 :(得分:0)
我注意到这些方法在特定的多处理环境中有所不同。描述为here