1

我正在研究这个例子

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

我不明白他为什么使用blockelement indir_q.get(True)

我想知道如果我使用程序的行为

self.dir_q.get()

文档说,如果我们不提供任何东西,那么如果队列中有东西,它将得到它,否则它将引发异常。

我认为那有什么问题

blocktimeout正在做什么

4

2 回答 2

1

阅读队列上的文档。

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

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

于 2013-03-03T09:48:14.113 回答
1

self.dir_q.get()阻塞直到有物品可用;self.stoprequest.set()因此,如果您取消超时,您的程序可能无法及时做出反应。

于 2013-03-03T15:34:22.893 回答