如何在 Multiprocessing executor.map() 函数中传递多个参数
How to pass multiple arguments in Multiprocessing executor.map() function
我看了几个关于多处理 map
函数的视频。
我知道我可以将一个列表作为参数发送到我想要使用 Multiprocessing 的目标函数,这将调用同一个函数 n 次(取决于传递的列表的大小)。
我正在努力做的是,如果我想将多个参数传递给该函数怎么办?
我基本上有一个大小为 n
的列表(它可以变化,但对于当前情况,它是 209)
我的函数需要 3 个参数...
- 列表的索引(0、1、2 等)
- 另一个包含数据的列表
- 固定整数值
我本可以将第二个和第三个参数用作全局变量,但这对我不起作用,因为我必须在 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
我看了几个关于多处理 map
函数的视频。
我知道我可以将一个列表作为参数发送到我想要使用 Multiprocessing 的目标函数,这将调用同一个函数 n 次(取决于传递的列表的大小)。
我正在努力做的是,如果我想将多个参数传递给该函数怎么办?
我基本上有一个大小为 n
的列表(它可以变化,但对于当前情况,它是 209)
我的函数需要 3 个参数...
- 列表的索引(0、1、2 等)
- 另一个包含数据的列表
- 固定整数值
我本可以将第二个和第三个参数用作全局变量,但这对我不起作用,因为我必须在 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