我正在使用多处理池来训练机器学习者。
每个 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()
从处理程序中执行,那么执行不会因错误而停止,内存使用会遵循这种奇怪的模式。