mob*_*upu 3 python windows parallel-processing multiprocessing python-multiprocessing
I'm trying to parallelize a script, but for an unknown reason the kernel just freeze without any errors thrown.
minimal working example:
from multiprocessing import Pool
def f(x):
return x*x
p = Pool(6)
print(p.map(f, range(10)))
Run Code Online (Sandbox Code Playgroud)
Interestingly, all works fine if I define my function in another file then import it. How can I make it work without the need of another file?
I work with spyder (anaconda) and I have the same result if I run my code from the windows command line.
发生这种情况是因为当您的子进程导入f.
他们需要 import f,因为Windows不支持 fork 作为新进程的启动方法(仅spawn)。一个新的 Python 进程必须从头开始,f导入,这个导入也会触发另一个池在所有子进程中创建......以及它们的子进程和它们的子进程......
为了防止这种递归,您必须在if __name__ == '__main__':应该在导入时运行的上半部分和下半部分之间插入一个-line,下半部分应该只在您的脚本作为主脚本执行时运行(仅适用于父脚本)。
from multiprocessing import Pool
def f(x):
return x*x
if __name__ == '__main__': # protect your program's entry point
p = Pool(6)
print(p.map(f, range(10)))
Run Code Online (Sandbox Code Playgroud)
当与 'spawn' 或 'forkserver' 启动方法一起使用而不是默认的 'fork' 时,在 Windows 和 Unix-y 系统上进行多处理时,必须像这样分离你的代码。通常,可以使用multiprocessing.set_start_method(method).
从Python 3.8 开始,macOS也默认使用 'spawn' 而不是 'fork'。
将上层“定义”中的任何脚本和下层“作为主要执行”中的任何脚本分开通常是一个好习惯,以使代码可导入而不会不必要地执行仅在作为顶级脚本运行时相关的部分。最后但并非最不重要的一点是,当您不混合定义和执行时,它有助于理解程序的控制流。
| 归档时间: |
|
| 查看次数: |
2904 次 |
| 最近记录: |