如何在 Multiprocessing executor.map() 函数中传递多个参数

How to pass multiple arguments in Multiprocessing executor.map() function

我看了几个关于多处理 map 函数的视频。

我知道我可以将一个列表作为参数发送到我想要使用 Multiprocessing 的目标函数,这将调用同一个函数 n 次(取决于传递的列表的大小)。

我正在努力做的是,如果我想将多个参数传递给该函数怎么办?

我基本上有一个大小为 n 的列表(它可以变化,但对于当前情况,它是 209)

我的函数需要 3 个参数...

  1. 列表的索引(0、1、2 等)
  2. 另一个包含数据的列表
  3. 固定整数值

我本可以将第二个和第三个参数用作全局变量,但这对我不起作用,因为我必须在 while 循环中调用 map 函数......并且在每一次迭代中,值这两个会变的。

我的函数 returns 两个值 我需要从调用它的函数中访问它们。这是我尝试过的但对我不起作用,

def main_fun():
    with concurrent.futures.ProcessPoolExecutor() as executor: 

        results = executor.map(MyFun, (row, pop[0].data, fitness) for row in range(0, len(pop[0].data)))

        for result in results:
            print(result)

我也尝试过使用 ZIP 功能,但还是没有成功。

如果你的 worker 函数的第二个和第三个参数(即 map 的第一个参数),那么你可以使用方法 functools.partial 指定第二个和第三个参数,而无需求助于全局变量的使用。例如,如果您的工作函数是 foo,则:

from concurrent.futures import ProcessPoolExecutor
from functools import partial


def foo(idx: int, lst: list, int_value: int):
    ...

def main():
    with ProcessPoolExecutor() as executor:
        worker = partial(foo, lst=pop[0].data, int_value=fitness)
        executor.map(worker, range(0, len(pop[0].data)))

if __name__ == '__main__':
    main()

所以现在我们只需要传递给map函数worker,它会调用两个固定参数,和一个iterable[=33] =] 参数。

如果您在循环中执行 map 调用,您当然会通过向 functools.partial 传递新参数来创建新的 worker 函数。

例如:

from concurrent.futures import ProcessPoolExecutor
from functools import partial


def foo(idx: int, lst: list, int_value: int):
    print(idx, lst[idx] * int_value, flush=True)

def main():
    l = [3, 5, 7]
    fitness = 9
    with ProcessPoolExecutor() as executor:
        worker = partial(foo, lst=l, int_value=fitness)
        executor.map(worker, range(0, len(l)))

if __name__ == '__main__':
    main()

打印:

0 27
1 45
2 63