使用不同的参数并行运行相同的函数,并知道哪个并行运行在 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测试运行器上