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



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

我知道,我可以将一个列表作为参数发送给我想用多处理器作为目标的函数,这将调用同一个函数n次(取决于传递的列表的大小(。

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

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

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

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

我本可以使用第二个和第三个参数作为全局变量,但这对我来说不起作用,因为我必须在while循环中调用map函数。。。在每一次迭代中,这两个值都会发生变化。

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

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函数,但再次尝试都没有成功。

如果您的辅助函数的第二个和第三个参数(即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,它将被称为两个固定参数和一个可迭代参数

如果您在循环中执行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

相关内容

  • 没有找到相关文章

最新更新