将超时参数添加到python的Queue.join()

时间:2009-10-14 06:02:49

标签: python join timeout queue

我希望能够加入()队列类,但是如果调用尚未返回,则会在一段时间后超时。 最好的方法是什么?是否可以通过使用元类继承队列?来实现它?

3 个答案:

答案 0 :(得分:19)

子类化Queue可能是最好的方法。这样的事情应该有效(未经测试):

def join_with_timeout(self, timeout):
    self.all_tasks_done.acquire()
    try:
        endtime = time() + timeout
        while self.unfinished_tasks:
            remaining = endtime - time()
            if remaining <= 0.0:
                raise NotFinished
            self.all_tasks_done.wait(remaining)
    finally:
        self.all_tasks_done.release()

答案 1 :(得分:11)

join()方法就是等待所有任务完成。如果您不关心任务是否实际完成,您可以定期轮询未完成的任务计数:

stop = time() + timeout
while q.unfinished_tasks and time() < stop:
    sleep(1)

当完成任务或超时时间已过时,此循环将存在。

雷蒙德

答案 2 :(得分:0)

首先,您应该确保队列中的所有工作线程都以task_done()

退出

要使用Queue实现超时功能,您可以将Queue的代码包装在一个线程中,并使用Thread.join([timeout])

为此线程添加超时

未经测试的示例,概述了我的建议

def worker():
    while True:
        item = q.get()
        do_work(item)
        q.task_done()

def queuefunc():
    q = Queue()
    for i in range(num_worker_threads):
        t = Thread(target=worker)
        t.setDaemon(True)
        t.start()

    for item in source():
        q.put(item)

    q.join()       # block until all tasks are done

t = Thread(target=queuefunc)
t.start()
t.join(100) # timeout applies here