在这种情况下,Python 中的 queue.get() 是怎么工作的?

1 投票
2 回答
4447 浏览
提问于 2025-04-17 17:45

我在研究这个例子

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

我不明白他在 dir_q.get(True) 中为什么使用了 block 这个参数

我想知道如果我使用

self.dir_q.get(),程序会有什么表现

文档说如果我们什么都不提供,那么如果队列里有东西,它会取出那个东西,否则就会抛出异常。

我觉得这样有什么问题呢

blocktimeout 是干什么的

2 个回答

1

先看看关于队列的说明。

Queue.get([block[, timeout]]) 从队列中取出一个项目并返回。如果可选参数block为真,并且timeout为None(默认值),那么如果没有项目可用,就会一直等下去。如果timeout是一个正数,最多会等timeout秒,如果这段时间内没有项目可用,就会抛出一个空的异常(Empty)。如果block为假,只有在有项目立即可用时才会返回一个项目,否则也会抛出空的异常(这个时候timeout会被忽略)。

当'block'参数(不是'element')为真,并且'timeout'是一个正数时,队列会等待'timeout'秒,直到队列中有项目可用。如果在调用Queue.get()时队列是空的,并且在指定的'timeout'时间内(比如0.05秒)没有其他线程往队列中放入项目(Queue.put()),那么队列就会抛出空的异常(Empty)。否则,它会返回另一个线程放入的第一个项目。

1

self.dir_q.get() 这个方法会一直等着,直到有东西可以取出来;所以如果你把超时时间去掉,你的程序可能就没法及时响应 self.stoprequest.set() 这个指令。

撰写回答