ProcessPoolExecutor does not start



我在Jupyter笔记本上工作。我是python中多处理的新手,我正在尝试将参数网格的函数计算并行化。以下是一段代码片段,非常能代表我正在做的事情:

import os
import numpy as np
from concurrent.futures import ProcessPoolExecutor
def f(x,y):
print(os.getpid(), x,y,x+y)
return x+y
xs = np.linspace(5,7,3).astype(int)
ys = np.linspace(1,3,3).astype(int)
func = lambda p: f(*p)
with ProcessPoolExecutor() as executor:
args = (arg for arg in zip(xs,ys))
results = executor.map(func, args)

for res in results:
print(res)

遗嘱执行人甚至都没有启动。

如果我连续执行相同的操作,例如列表理解、,没有任何问题

args = (arg for arg in zip(xs,ys))
results = [func(arg) for arg in args]

您在Windows上运行吗?我认为您的主要问题是,每个进程都试图重新执行整个脚本,因此您应该包含一个if名称==">main";检查我认为您在尝试使用无法pickle的lambda函数时遇到了第二个问题,因为进程通过pickle数据进行通信。有一些解决方法,但在这种情况下,看起来你并不真正需要lambda。试试这样的东西:

import os
import numpy as np
from concurrent.futures import ProcessPoolExecutor

def f(x, y):
print(os.getpid(), x, y, x + y)
return x + y
if __name__ == '__main__':
xs = np.linspace(5, 7, 3).astype(int)
ys = np.linspace(1, 3, 3).astype(int)
with ProcessPoolExecutor() as executor:
results = executor.map(f, xs, ys)
for res in results:
print(res)

最新更新