栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

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

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



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/660554.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号