Python多处理队列.选择超时时间vs睡眠



我找不到任何关于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()

相关内容

  • 没有找到相关文章

最新更新