我找不到任何关于python&queue for queue 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:随着时间的推移
while True:
try:
if self._queue.get_nowait() == '!STOP!: break
except:
# Queue.Empty session, keep going
-- do stuff here --
time.sleep(period)
Snippet 1是首选,因为它不是睡觉,而是检查毒丸排队,而是“睡觉”。检查队列。当然这是一个很有争议的问题,因为这段时间通常只有0.100到0.500秒之间但是我不确定队列中是否有什么东西。我错过了。
答案 0 :(得分:1)
正如你所说,第一个选择是一个更好的选择,因为而不是无条件地为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()