如何在Python中创建两级分层进程池?

问题描述 投票:0回答:1

我需要计算数十万个 x 的数学函数 f(x)。由于其奇异的数值特性,我需要使用四种数值算法。我的实验表明,在不同的点,四种算法的速度有很大不同:A点最快的算法可能在B点最慢。因此我需要实现一个如图所示的分层任务池。

或者使用多个进程池更容易吗?

python parallel-processing python-multiprocessing
1个回答
0
投票

我认为这是一个很好的问题。我认为最简单的解决方案是使用 python 的

multiprocessing
模块,如下所示

您可以创建一个函数(称为

run_functions()
),它接受输入值 (
x0
,
x1
, ...
xn
) 和函数列表 ([
algo_a
,
algo_b
, ..) .
algo_n
]) - 如果您愿意,这适用于超过 4 个算法,函数 (
run_functions()
) 将运行
input_value
上的所有算法,并且获得响应的第一个函数/算法将是当其他进程将被终止时使用。

import multiprocessing

# functions is a list of type callable
def run_functions(input_value: int, functions: list):
    results = []
    processes = []
    for function in functions:
        process = multiprocessing.Process(target=function, args=(input_value,))
        processes.append(process)
        process.start()

    for process in processes:
        process.join()

你可以像这样调用这个函数(示例)

import multiprocessing
import time

def f1(x) -> int:
    time.sleep(2)  # Simulating some time-consuming operation
    return x * 2

def f2(x) -> int:
    time.sleep(1)  # Simulating fastest algo
    return x + 5 

def f3(x) -> int:
    time.sleep(3)  # Simulating slowest algo
    return x ** 2

def fn(x) -> int:
    time.sleep(1.5)
    return x + 10

def run_functions(input_value: int, functions: list):
    results: list[int] = []
    processes: list[multiprocessing.Process] = []
    for function in functions:
        process = multiprocessing.Process(target=function, args=(input_value,))
        processes.append(process)
        process.start()

    for process in processes:
        process.join()

if __name__ == "__main__":
    input_value: int = int(input("Enter an integer value: "))
    functions: list = [f1, f2, f3, fn]

    run_functions(input_value, functions)

对于上面的例子:它会提示您输入一个整数值,然后它将根据该输入值执行函数。无论哪个函数先完成都将允许脚本继续执行,而其他函数将被终止。

这可能不是最优雅的解决方案,也可能不是最快的,但对我来说是最直观的。

© www.soinside.com 2019 - 2024. All rights reserved.