发生这种情况是因为在子进程导入时,您没有保护代码的“过程”部分免于重新执行
f。
它们需要import
f,因为 Windows 不支持将fork作为新进程的启动方法(仅 spawn
)。必须从头开始一个新的Python进程,将其
f导入,并且此导入还将触发在所有子进程…及其子进程及其子进程中创建另一个Pool。
为了防止这种递归,您必须
if __name__ =='__main__':在上部(在导入时运行)和下部(仅在将脚本作为主脚本执行时运行)之间插入-线(仅对于父级情况)。
from multiprocessing import Pooldef f(x): return x*xif __name__ == '__main__': # protect your program's entry point p = Pool(6) print(p.map(f, range(10)))
当与“ spawn”或“ forkserver”启动方法(而非默认的“ fork”)一起使用时,在Windows和Unix-
y系统上的多处理中必须这样分隔代码。通常,可以使用来修改启动方法
multiprocessing.set_start_method(method)。
从Python 3.8开始,
macOS 默认还使用“ spawn”而不是“ fork”。
通常的一个好习惯是,将 任何
脚本以高位“定义”和低位“执行为主”分开,以使代码可导入而无需不必要的部分执行,而仅当作为顶级脚本运行时才有意义。最后但并非最不重要的一点是,当您不混合定义和执行时,它有助于理解程序的控制流。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)