Py学习  »  Python

如何在Python的concurrent.futures中并发调用多个单独的函数并获得有序的结果?

Tom • 5 年前 • 1731 次点击  

假设我有两个独立的函数。我想同时调用它们,使用python的 concurrent.futures.ThreadPoolExecutor . 有没有办法叫他们用 Executor 并确保按提交顺序返回?

我知道这是可能的 Executor.map ,但我希望并行化两个单独的函数,而不是一个具有可交互输入的函数。

我有下面的示例代码,但不能保证 fn_a 将首先返回(通过设计 wait 功能)。

from concurrent.futures import ThreadPoolExecutor, wait
import time


def fn_a():
    t_sleep = 0.5
    print("fn_a: Wait {} seconds".format(t_sleep))
    time.sleep(t_sleep)
    ret = t_sleep * 5  # Do unique work
    return "fn_a: return {}".format(ret)


def fn_b():
    t_sleep = 1.0
    print("fn_b: Wait {} seconds".format(t_sleep))
    time.sleep(t_sleep)
    ret = t_sleep * 10  # Do unique work
    return "fn_b: return {}".format(ret)


if __name__ == "__main__":
    with ThreadPoolExecutor() as executor:
        futures = []
        futures.append(executor.submit(fn_a))
        futures.append(executor.submit(fn_b))
        complete_futures, incomplete_futures = wait(futures)
        for f in complete_futures:
            print(f.result())

我也很想知道有没有办法 joblib

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/49333
文章 [ 1 ]  |  最新文章 5 年前
Tom
Reply   •   1 楼
Tom    6 年前

我觉得用lambda和partials找到了一个合理的选择。部分允许我将参数传递给并行iterable中的某些函数,但不能传递给其他函数。

from functools import partial
import concurrent.futures

fns = [partial(fn_a), partial(fn_b)]
data = []
with concurrent.futures.ThreadPoolExecutor() as executor:
    try:
        for result in executor.map(lambda x: x(), fns):
            data.append(result)

因为它在使用 executor.map ,它按顺序返回。