想象一下,我有一个像这样的消费者的任务队列(这几乎与示例代码here相同):
def worker(tasks):
while True:
try:
item = tasks.get_nowait()
except:
return
execute(item)
tasks.task_done()
和这样的制作人:
def batch_execute(items, n_threads):
tasks = Queue()
for item in items:
tasks.put(item)
for n in range(n_threads):
t = threading.Thread(target=worker, args=tasks)
t.start()
tasks.join()
这是有效的,除了execute(item)可以抛出异常。如果发生这种情况,给定的线程将保释,其他线程继续运行,tasks.join()将无限期挂起。这两个特征都是不可取的。是否存在人们使用的典型设计,例如将子线程中的异常“转发”到父线程中并取消阻止tasks.join()?或者我是否必须手动实现python的Queue类的所有内容?