我需要计算数十万个 x 的数学函数 f(x)。由于其奇异的数值特性,我需要使用四种数值算法。我的实验表明,在不同的点,四种算法的速度有很大不同:A点最快的算法可能在B点最慢。因此我需要实现一个如图所示的分层任务池。
或者使用多个进程池更容易吗?
我认为这是一个很好的问题。我认为最简单的解决方案是使用 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)
对于上面的例子:它会提示您输入一个整数值,然后它将根据该输入值执行函数。无论哪个函数先完成都将允许脚本继续执行,而其他函数将被终止。
这可能不是最优雅的解决方案,也可能不是最快的,但对我来说是最直观的。