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

时间:2015-04-20 21:36:53

标签: python multithreading

我正在使用python Queue存储要由线程处理的项目。从我在网上看到的,在队列中放入一个'None'对象并设置这样的线程处理将使线程停止。 (它确实如此)

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

现在我在网上找不到关于这种类型的for循环的很多信息。从我所看到它刚刚结束,并不会处理任何在队列中留下None对象的东西。 在末尾添加queue.task_done()不起作用。

有人可以向我解释一下这种类型的for循环。他们是如何命名的,他们如何在一般情况下工作,或指向我一些关于它的好文档,因为我找不到任何。

5 个答案:

答案 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