Python 这个循环是如何工作的:对于iter中的项目(queue.get,None)?

Python 这个循环是如何工作的:对于iter中的项目(queue.get,None)?,python,multithreading,Python,Multithreading,我使用python队列存储线程要处理的项目。从我在网上读到的内容来看,在队列中放置一个“None”对象并设置这样的线程处理将使线程停止。(确实如此) 现在我在网上找不到很多关于这种for循环的信息。从我所看到的情况来看,它只是结束,不会处理队列中留下None对象的任何其他内容。 在末尾添加queue.task_done()无效 有人能给我解释更多关于这种for循环的情况吗。它们是如何命名的,它们通常是如何工作的,或者告诉我一些关于它的好文档,因为我找不到 见: 如果给出了第二个参数sentine

我使用python队列存储线程要处理的项目。从我在网上读到的内容来看,在队列中放置一个“None”对象并设置这样的线程处理将使线程停止。(确实如此)

现在我在网上找不到很多关于这种for循环的信息。从我所看到的情况来看,它只是结束,不会处理队列中留下None对象的任何其他内容。 在末尾添加queue.task_done()无效

有人能给我解释更多关于这种for循环的情况吗。它们是如何命名的,它们通常是如何工作的,或者告诉我一些关于它的好文档,因为我找不到

见:

如果给出了第二个参数sentinel,那么o必须是可调用的对象。在本例中创建的迭代器将调用o,每次调用其
next()
方法时不带任何参数;如果返回的值等于sentinel,则将引发
StopIteration
,否则将返回该值

因此,循环的行为等效于:

sentinel = None
while True:
  item = queue.get()
  if item == sentinel:
    break
  # do stuff
  queue.task_done()
这一行:

for item in iter(queue.get, None):
阅读

继续调用
queue.get
,然后运行循环体,直到
queue.get()==None


它是iter()的第二种形式:

在第二种形式中,调用callable直到它返回sentinel

(来自
帮助(iter)


所以每次for语句试图从iter返回的迭代器中获取元素时,它调用
queue.get()
,检查是否返回None,并将返回值作为
项传递给for语句体。当有人将None终止符推到队列上时,
queue.get()
返回None,导致迭代器抛出
StopIteration
,解释器离开语句块。

我认为关键部分是:

注意,当没有元素保留并且没有设置sentinel值时,这将被阻止


因此,基本上这种方法不会自动在任何队列上运行,您必须输入一个
None
值来指示进程结束

我注意到,在特定的多处理环境中,方法有所不同
-它被用作
iter(callable,sentinel)
,而不是用iterable调用它,在那里它将调用
callable()
,并生成结果,直到它等于
sentinel
,表示迭代的结束。请参阅以获取更容易理解的示例。注意,需要添加对
队列的调用。task_done()
在for循环后调用,将sentinel任务标记为完成,否则
队列.join()
将挂起。相关:
是sentinel
还是
==sentinel
?@Eric:很好。是的,语义是
==sentinel
的语义。已更新。
for item in iter(queue.get, None):
iter(callable, sentinel) -> iterator