使用不同的参数并行运行相同的函数,并知道哪个并行运行在 python 中结束了

Posted

技术标签:

【中文标题】使用不同的参数并行运行相同的函数,并知道哪个并行运行在 python 中结束了【英文标题】:Run same function in parallel with different parameters and know which parallel run has ended in python 【发布时间】:2020-06-17 17:23:03 【问题描述】:

我有一个执行函数,它应该在多个设备上并行运行。而且我需要在完成每次并行运行时调用不同的函数。我迫不及待地等待所有并行调用完成,因为根据传递的参数需要非常不同的时间。

    def func1(device, arg1, arg2):
        # do something

    for device in devices:
       # Call func1 with different arguments in parallel
       # If one of the parallel is finished call func2(arg, arg1, arg2) with different arguments.

如何在 Python 中做到这一点?

【问题讨论】:

你知道调用func2的参数吗?或者这些参数是func1的结果? 也可以是结果,也可以根据知道哪个设备已经完成运行来决定。 发送到函数唯一编号并用结果返回它 - 或者用结果返回参数 - 这样你就可以识别过程。 @furas 你能不能只写一个伪代码。这对我会有帮助。谢谢。 没什么可写的——只有result, parameters = function(parameters)def function(parameters): ... return result, parameters 【参考方案1】:

查看此代码示例,它使用future.ThreadPoolExecutor 进行并行执行。

from concurrent.futures import ThreadPoolExecutor, Future, as_completed

devices = []


def func1(device, arg1, arg2):
    pass


def do_after_func1(func1_result: Future):
    identifier = func1_result.arg
    result = func1_result.result()
    # do what ever
    pass


device_executors = ThreadPoolExecutor(max_workers=20)
args = []  # can be anything
futures = []
for device in devices:
    tracker = device_executors.submit(func1, *args)
    tracker.arg = "some-identififcation-if-you-need"
    tracker.add_done_callback(do_after_func1)
    futures.append(tracker)

您可以以callable 的形式提交要并行执行的任何内容,结果可以汇集到回调函数do_after_func1。你可以在这里决定之后调用什么。所有这些都是并行发生的。

如果您认为需要多个进程,也可以使用ProcessPoolExecutor

您可以从官方文档中了解更多信息。

【讨论】:

以上是关于使用不同的参数并行运行相同的函数,并知道哪个并行运行在 python 中结束了的主要内容,如果未能解决你的问题,请参考以下文章

并行执行没有发生在Cucumber JVM 4.0.0和Junit测试运行器上

如何异步运行函数以使用 Django 应用在 Heroku 上并行计算?

如何同时使用 MKL 的并行和串行版本?

如何在并行 Scala 中运行不同的函数

如何安排一对不同的功能,以便真正并行运行?

调试并行运行的 Promise 的最佳方法