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