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

tru*_*ite 2 python multithreading

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

for item in iter(queue.get, None):
    #do stuff
    queue.task_done()
Run Code Online (Sandbox Code Playgroud)

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

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

Eri*_*ric 6

这一行:

for item in iter(queue.get, None):
Run Code Online (Sandbox Code Playgroud)

"继续打电话queue.get,然后运行循环体,直到queue.get() == None


Dan*_*den 5

请参阅该函数的文档iter()

如果给出第二个参数sentinel ,则o必须是可调用对象。在这种情况下创建的迭代器将在每次调用其方法时不带参数地调用onext();如果返回的值等于SentinelStopIteration将被提升,否则将返回该值。

所以循环的行为相当于:

sentinel = None
while True:
  item = queue.get()
  if item == sentinel:
    break
  # do stuff
  queue.task_done()
Run Code Online (Sandbox Code Playgroud)