【发布时间】:2013-03-20 22:51:23
【问题描述】:
我使用的是 Python 2.7.3。我使用子类 multiprocessing.Process 对象并行化了一些代码。如果我的子类 Process 对象中的代码没有错误,则一切正常。但是,如果我的子类 Process 对象中的代码有错误,它们显然会默默地崩溃(没有堆栈跟踪打印到父 shell)并且 CPU 使用率将下降到零。父代码永远不会崩溃,给人的印象是执行只是挂起。同时,很难找出代码中的错误在哪里,因为没有给出错误在哪里的指示。
我在 stackoverflow 上找不到任何其他处理相同问题的问题。
我猜想子类 Process 对象似乎会默默地崩溃,因为它们无法将错误消息打印到父的 shell,但我想知道我能做些什么,以便我至少可以更有效地调试(并且这样我代码的其他用户也可以在遇到问题时告诉我)。
编辑:我的实际代码太复杂了,但是一个带有错误的子类 Process 对象的简单示例是这样的:
from multiprocessing import Process, Queue
class Worker(Process):
def __init__(self, inputQueue, outputQueue):
super(Worker, self).__init__()
self.inputQueue = inputQueue
self.outputQueue = outputQueue
def run(self):
for i in iter(self.inputQueue.get, 'STOP'):
# (code that does stuff)
1 / 0 # Dumb error
# (more code that does stuff)
self.outputQueue.put(result)
【问题讨论】:
-
你能发布一个最小的测试用例来说明这个问题吗?
-
@Blender 是的。添加了一些代码。
-
这是 Python 多处理的一个常见痛点。我建议使用 Ray github.com/ray-project/ray。像这样的异常可以很好地传播开箱即用。
标签: python python-2.7 parallel-processing multiprocessing