gpt4 book ai didi

python - 多处理给出 AssertionError : daemonic processes are not allowed to have children

转载 作者:太空宇宙 更新时间:2023-11-04 02:21:34 25 4
gpt4 key购买 nike

我是第一次尝试使用多处理。所以我想我会做一个非常简单的测试示例,其中包含 100 个不同的数字。

from multiprocessing import Pool
from primefac import factorint
N = 10**30
L = range(N,N + 100)
pool = Pool()
pool.map(factorint, L)

这给了我错误:

Traceback (most recent call last):
File "test.py", line 8, in <module>
pool.map(factorint, L)
File "/usr/lib/python2.7/multiprocessing/pool.py", line 251, in map
return self.map_async(func, iterable, chunksize).get()
File "/usr/lib/python2.7/multiprocessing/pool.py", line 567, in get
raise self._value
AssertionError: daemonic processes are not allowed to have children

我看到了 Python Process Pool non-daemonic?讨论了这个问题,但我不明白为什么它与我的简单玩具示例相关。我做错了什么?

最佳答案

问题似乎是 primefac 使用了它自己的 multiprocessing.Pool。不幸的是,当 PyPI 关闭时,我找不到该模块的源代码——但我确实在 GitHub 上找到了各种分支,比如 this one , 它们都有 multiprocessing 代码。

因此,您看似简单的示例并不是那么简单 — 因为它正在导入和运行非简单代码。

默认情况下,所有 Pool 进程都是守护进程,因此您无法从另一个 Pool 中创建更多子进程。通常,尝试这样做是错误的。

如果你真的想要多处理这些因素,即使其中一些因素要多处理他们自己的工作(很可能在不增加任何并行性的情况下增加更多的争用开销),那么你只需要子类化 Pool 并覆盖它——如 the related question that you linked 中所述.

但最简单的事情就是不要在这里使用 multiprocessing,如果 primefac 已经在有效地使用你的核心。 (如果你需要准并发,在答案进来时得到答案而不是按顺序得到它们,我想你可以用 thread 池来做到这一点,但我认为这没有任何优势在这里——你没有在任何地方使用 imap_unordered 或明确的 AsyncResult。)

或者,如果大部分时间没有使用您所有的核心,那么只有在对一些数字进行因式分解结束时才对“棘手的余数”这样做,而您有 7 个核心60% 的时间处于空闲状态……那么您可能想要完全阻止 primefac 使用 multiprocessing。我不知道该模块是否有用于执行此操作的公共(public) API。如果是这样,当然就使用它。如果不是……好吧,您可能必须对其某些代码进行子类化或猴子修补,或者在最坏的情况下,对其导入的 multiprocessing 进行猴子修补,这可能不值得这样做。

理想的 解决方案可能是重构 primefac 以将“棘手的剩余”作业推送到您已经在使用的同一个池中。但这可能是迄今为止最多的工作,并没有更多的好处。


附带说明一下,这不是你的问题,但你应该在你的顶级代码周围设置一个 __main__ 守卫,如下所示:

from multiprocessing import Pool
from primefac import factorint

if __name__ == '__main__':
N = 10**30
L = range(N,N + 100)
pool = Pool()
pool.map(factorint, L)

否则,当使用 spawnforkserver 启动方法运行时——请注意 spawn 是 Windows 上唯一可用的方法——每个池进程将尝试创建另一个子池。因此,如果您在 Windows 上运行您的代码,您会得到相同的断言 — 作为 multiprocessing 保护您免受意外 forkbombing 系统的一种方式。

这在 safe importing of main module 下进行了解释在 multiprocessing 文档的“编程指南”部分。

关于python - 多处理给出 AssertionError : daemonic processes are not allowed to have children,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51485212/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com