如何从池中获取第一个完成的异步结果

时间:2015-05-21 21:21:35

标签: python multithreading asynchronous

假设我有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失败了。

我想知道是否有某种方法可以获得首先准备好的异步结果。

2 个答案:

答案 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]