多处理池示例不起作用并冻结内核

多处理池示例不起作用并冻结内核,第1张

多处理池示例不起作用并冻结内核

发生这种情况是因为在子进程导入时,您没有保护代码的“过程”部分免于重新执行

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”。

通常的一个好习惯是,将 任何
脚本以高位“定义”和低位“执行为主”分开,以使代码可导入而无需不必要的部分执行,而仅当作为顶级脚本运行时才有意义。最后但并非最不重要的一点是,当您不混合定义和执行时,它有助于理解程序的控制流。



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5666670.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存