将函数传递给多处理池中的地图或星图

Passing function to map or starmap in multiprocessing pool

我一直在尝试在我的机器上的 Jupyter 上测试这段简单的代码,但该单元会无限期地运行而不会输出任何内容。有什么错误吗?我对 pool.map 的 pandas 进程使用了​​完全相同的一段代码,一切正常,但无法弄清楚这里发生了什么。

import multiprocessing as mp 
pool1 = mp.Pool(processes = 3)

def sumP(a, b):
    return (a * b) / (a - b + 1)

f1, f2, f3 = 24, 31, 45
new_rows2 = pool1.starmap(sumP, [(f1, f2), (f2, f3), (f1, f3)]) 
print(new_rows2)

并且单元格保持 运行。不管我使用 pool1.map 还是 pool1.starmap。 你们建议任何其他并行化此过程的方法吗?

发生这种情况是因为工作进程试图导入 sumP,这还会创建另外 3 个进程,无限循环。

您需要对多进程创建进行保护,以免工作进程无限期地产生:

import multiprocessing as mp 

def sumP(a, b):
    return (a * b) / (a - b + 1)

f1, f2, f3 = 24, 31, 45

if __name__ == "__main__":
    pool1 = mp.Pool(processes=3)
    new_rows2 = pool1.starmap(sumP, [(f1, f2), (f2, f3), (f1, f3)]) 
    print(new_rows2)

multiprocessing docs 下查找“安全导入主模块”以获取更多信息。您不应在导入主模块期间创建池。