我找不到任何关于python的queue get with timeout: get([block[, timeout]])的文档,而python的time.sleep()在http://www.pythoncentral.io/pythons-time-sleep-pause-wait-sleep-stop-your-code/上有很好的文档。
我使用linux时间对5,500和5000的循环计时,周期都为100毫秒,它们看起来都很相似。
代码片段1:与队列超时
while True:
try:
if self._queue.get(True,period) == '!STOP!: break
except:
# Queue.Empty session, keep going
-- do stuff here --
代码片段2:With time sleep
while True:
try:
if self._queue.get_nowait() == '!STOP!: break
except:
# Queue.Empty session, keep going
-- do stuff here --
time.sleep(period)
片段1是首选,因为它不是休眠,然后检查毒丸队列,而是"休眠"检查队列。当然,这是一个相当有争议的点,因为周期通常只在0.100到0.500秒之间,但我不想确保队列中没有东西。我知道我错过了什么。
正如你所说,第一个选项是一个更好的选择,因为不是无条件地为period
休眠,然后检查队列中是否有任何东西,然后再次休眠,你正在积极地等待put
进入整个period
的队列,然后只是简单地做一些事情,而不是等待'!STOP!'
到达。没有隐藏的陷阱;get_nowait
在内部使用time.time()
+ period
来决定等待的时间:1)能够获得队列上的内部锁;2)等待队列中实际存在的东西。以下是multprocessing/queues.py
的相关代码:
if block:
deadline = time.time() + timeout
if not self._rlock.acquire(block, timeout): # Waits for up to `timeout` to get the lock
raise Empty # raise empty if it didn't get it
try:
if block:
timeout = deadline - time.time()
if timeout < 0 or not self._poll(timeout): # Once it has the lock, waits for however much time is left before `deadline` to something to arrive
raise Empty
elif not self._poll():
raise Empty
res = self._recv()
self._sem.release()
return res
finally:
self._rlock.release()