【发布时间】:2017-11-27 19:13:10
【问题描述】:
我正在使用多处理池来训练机器学习者。
每个 LearnerRun 对象都有一个学习者、一个超参数字典、一个名称、另一个选项字典中的更多选项、要写入结果的目录的名称、一组要训练的示例 ID(切片或numpy 数组),以及一组要测试的示例 ID(也是切片或 numpy 数组)。重要的是,尚未读取训练和测试数据:ID 集相对较小,并指导后续函数的数据库读取行为。
我打电话给self.pool.apply_async(learner_run.run),以前可以正常工作。现在池似乎已加载完毕,但 run() 函数顶部的打印语句从未打印,因此进程实际上并未运行。
我已经跟踪了一些其他的线程,发现我可以通过handler = self.pool.apply_async(learner_run.run) 和handler.get() 更详细地查看问题。这将打印“SystemError: NULL result without error in PyObject_Call”。
太好了,我可以用谷歌搜索。但是我在 Multiprocessing 的这个问题上所能找到的只是它可能是在将太大而无法腌制的参数传递给子进程时引起的。 但是,我显然没有向我的子进程传递任何参数。那么是什么给了?
除了超过分配的内存大小的参数(我有理由确信这不是这里的问题)之外,还有什么可能导致 apply_async 给出空结果?
再一次,这在我去度假之前有效并且没有改变。 对其他代码进行哪些类型的更改可能会导致此功能停止工作?
如果我不尝试从处理程序中 get() 以便执行不会因错误而停止,那么内存使用将遵循这种奇怪的模式。
【问题讨论】:
标签: python multiprocessing system-error pyobject