- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我是第一次尝试使用多处理。所以我想我会做一个非常简单的测试示例,其中包含 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)
否则,当使用 spawn
或 forkserver
启动方法运行时——请注意 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/
我在一个Spring Boot应用程序中有以下路线。并进行以下测试。第二个测试的目的是验证如果将消息“{}”发送到DIRECT:LOG终结点,它将超出To(Bean-validator://check
这是我的简单 test.py 脚本: import argparse parser = argparse.ArgumentParser('A long string that goes on and
我在Android Studio的另一台计算机上打开我的Kotlin项目,并在事件日志中遇到错误: AssertionError: Root package must be initialized R
我在redux (redux@3.7.2) 中使用combineReducer 方法时遇到错误。当我只使用一个 reducer 时,相同的代码将起作用。 Running code here 代码 co
我目前正在对我的 Controller 的一个方法进行单元测试。只是尝试测试该方法是否返回正确的字符串。 @RequestMapping(value = "/createTestscenario",
我收到错误: java.lang.AssertionError: expected: learning.java.advancedoop2.MyComplex but was: learning.ja
这个问题在这里已经有了答案: How can I check if two ArrayList differ, I don't care what's changed (6 个答案) 关闭 7 年前
我正在准备 OCP 7,我在其中一本证书书上遇到了这篇文章。 To discourage you from trying to substitute an assertion for an excep
我有一个 index.js 文件,它实现了一个 forEach 助手,如下所示: var images = [ { height: 10, width: 30 }, { height: 20,
作为实验,我 try catch 失败的断言。 try: assert 1==2 except Exception as e: print e 为什么没有显示? 最佳答案 >>> try: asser
我在 django 中创建了一个调用函数的命令。该函数执行 django orm 调用: def get_notes(): notes = Note.objects.filter(number
我有一个用户类和一个主题类。用户类可以创建一个主题,将一个主题添加到主题的字典中,并且应该能够返回主题的字典。我是 python 的新手,所以我在 python 逻辑/语法方面遇到了问题 class
我正在尝试创建一个基于用户身份验证限制结果的 View 。出于某种原因,列表切片总是导致 AssertionError Cannot filter a query once a slice has b
我正在使用带有注释处理器的内部 sun API (com.sun.tools.javac) 修改现有类。我能够使用以下代码生成 MethodDecl 并将其添加到 ClassDecl: JCTree.
这是原代码 //@author Brian Goetz and Tim Peierls @ThreadSafe public class SafePoint { @GuardedBy("thi
我能够访问 PasswordChangeSerializer 的 validate() 函数的 user_queryset,但是我仍然收到此错误: assert value is not None,
我正在尝试从破解编码面试中回答以下问题。下面的代码是 GitHub 上一个项目的一部分,here . Given a binary search tree, design an algorithm w
我正在使用 IBM Bluemix 为学校项目创建 Web 服务。 我设置了本地主机来运行我的代码,但是当我在 Windows 10 命令提示符中键入“npm start”时,我遇到了“assert.
将 tf.Dataset 传递到 tf.Keras 模型的 fit() 时,我收到 AssertionError方法。 我正在使用tensorflow==2.0.0。 我检查了我的数据集是否有效: #
我有一个异步回调,我为此编写了一个 junit 测试用例。我正在遵循 CountDownLatch 方法。如果回调失败,我必须使测试用例失败。这是我的代码 lock = new CountDo
我是一名优秀的程序员,十分优秀!