繁体   English   中英

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

[英]How does this loop works: for item in iter(queue.get, None)?

我正在使用python Queue存储要由线程处理的项目。 根据我在网上阅读的内容,将“ None”对象放入队列中并像这样设置线程处理将使线程停止。 (确实如此)

for item in iter(queue.get, None):
    #do stuff
    queue.task_done()

现在,我在网上找不到许多有关这种for循环的信息。 从我看到的结果来看,它只是结束,不会处理其他任何将None对象留在队列中的事情。 最后添加queue.task_done()不起作用。

有人可以向我详细说明这种类型的for循环。 它们的命名方式以及它们的总体工作方式,或者由于找不到任何相关信息,因此向我指出了一些好的文档。

这行:

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

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

请参阅文档iter()函数

如果给定第二个参数sentinel ,则o必须是可调用对象。 在这种情况下创建的迭代器将在每次调用next()方法时不带任何参数的o 如果返回的值等于sentinel ,则将引发StopIteration ,否则将返回该值。

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

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

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

 iter(callable, sentinel) -> iterator 

在第二种形式中,可调用对象被调用,直到它返回标记。

(来自help(iter) )。

因此,每次for-statement尝试从iter返回的迭代器中获取元素时,都会调用queue.get() ,检查返回的值是否为None,并将返回值作为item传递给for-statement-body。 当有人将None-terminator推入队列时, queue.get()返回None,导致迭代器抛出StopIteration并且解释器离开for语句块。

我认为最重要的是:

注意当没有剩余元素并且没有放置哨兵值时,它将阻塞。

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

我注意到这些方法在特定的多处理环境中有所不同。 在这里描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM