0

我有以下线程,队列 q 大部分时间都是空的:

def run(self):

    while True:
        if not self.exit_flag:
            items = self.q.get()
            q.work_it()
        else:
            return 0

如果设置了退出标志,它不可能立即退出,因为它可能当前阻塞在

items = self.q.get()

如果我设置超时

items = self.q.get(True, 0.1)

我经常会引发 Empty 异常,因为队列通常是空的,使用的资源比我想要的多。

如果我忙着等待

def run(self):

    while True:
        if not self.exit_flag:
            if not self.q.empty():
                items = self.q.get()
                q.work_it()
            time.sleep(0.1)
        else:
            return 0

然后我忙着等待,而不是使用 Queue.get() 的阻塞功能,这看起来很丑陋。好像我在这里错过了这个问题的优雅解决方案?有没有或者我应该只使用忙等待解决方案?

4

2 回答 2

0

One approach with no third party dependencies is to use the consumer/producer pattern where you have your code run in it's own thread so it's not blocking.

于 2017-06-16T20:56:07.977 回答
0

exit_flag考虑在队列中放置一个特殊的“关闭”指示器,而不是使用标志。当工作人员将关闭指示器出列时,让它识别关闭指示器并关闭而不是继续。

于 2017-06-16T20:52:21.467 回答