具有超时与睡眠的Python多处理队列.get

时间:2014-07-12 14:41:06

标签: python timeout multiprocessing sleep

我找不到任何关于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秒之间但是我不确定队列中是否有什么东西。我错过了。

1 个答案:

答案 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()