在这种情况下,queue.get()如何在python中工作

时间:2013-03-03 09:30:54

标签: python multithreading queue

我正在研究这个例子

http://eli.thegreenplace.net/2011/12/27/python-threads-communication-and-stopping/

他像这样使用

while not self.stoprequest.isSet():
    try:
        dirname = self.dir_q.get(True, 0.05)
        ... # do work
    except Queue.Empty:
        continue

我不明白为什么他在block

中使用了dir_q.get(True)元素

我想知道如果我使用

程序的行为

self.dir_q.get()

文档说如果我们不提供任何内容,那么如果队列中存在任何东西,那么它将获得它会引发异常。

我认为那个问题是什么

blocktimeout正在做什么

2 个答案:

答案 0 :(得分:1)

阅读队列上的文档。

  

Queue.get([block [,timeout]])   从队列中删除并返回一个项目。如果可选的args块为true且timeout为None(默认值),则在必要时阻止,直到某个项可用为止。如果timeout是一个正数,它会阻止最多超时秒,如果在该时间内没有可用的项,则会引发Empty异常。否则(块为假),如果一个项立即可用,则返回一个项,否则引发Empty异常(在这种情况下忽略超时)。

当'block'参数(不是'element')为True,'timeout'为正数时,Queue将等待'timeout'秒,直到Queue中有一个元素可用。如果Queue.get()被调用时Queue为空,并且没有其他线程Queue.put()在指定的'timeout'(例如.05秒)内成为Queue上的元素,则Queue引发Empty。否则它返回另一个线程的第一个元素Queue.put()。

答案 1 :(得分:1)

self.dir_q.get()阻止,直到某个项目可用;因此,如果删除超时,您的程序可能无法及时对self.stoprequest.set()作出反应。