假设我有3个任务。
tasks = [task1, task2, task3]
我想并行运行3个任务,所以我将它们放在一个线程池中。
from multiprocessing.pool import ThreadPool
worker_pool = ThreadPool(len(tasks))
async_results = [worker_pool.apply_async(task) for task in tasks]
然后我需要get()
这些异步结果。这是我的工作:
[async_result.get() for async_result in async_results]
但是,此方法逐个尝试get()
这些异步结果。 task2实际上可能在进程中间失败,我希望通过get()
知道相应的异步结果。在这种情况下,此处的方法实际上将在第一个任务中被阻止。我只能注意到任务1完成后task2失败了。
我想知道是否有某种方法可以获得首先准备好的异步结果。
答案 0 :(得分:3)
我不认为多处理池能够做到这一点。你真的应该尝试concurrent.futures
,它提供了比Pool更多的功能,并且更容易使用。
concurrent.futures.as_completed
仅适用于您的任务:
import concurrent.futures
with concurrent.futures.ProcessPoolExecutor(max_workers=5) as worker_pool:
futures = [executor.submit(task) for task in tasks]
for future in concurrent.futures.as_completed(futures):
# completed task is yielded first
result = future.result()
就是这样。
答案 1 :(得分:0)
您可以查看Pool.imap_unordered:
async_results = worker_pool.imap_unordered(apply, tasks)
results = [result for result in async_results]