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