【发布时间】:2015-11-10 06:44:20
【问题描述】:
我有一些代码需要在其他几个可能挂起或出现不受我控制的问题的系统上运行。我想使用 python 的多处理来生成子进程以独立于主程序运行,然后当它们挂起或出现问题时终止它们,但我不确定解决这个问题的最佳方法。
当调用 terminate 时,它确实杀死了子进程,但随后它变成了一个已失效的僵尸,直到进程对象消失才会释放。下面的示例代码中循环永远不会结束的地方可以杀死它并在再次调用时允许重生,但似乎不是解决这个问题的好方法(即在 __init__() 中使用 multiprocessing.Process() 会更好)。
有人有什么建议吗?
class Process(object):
def __init__(self):
self.thing = Thing()
self.running_flag = multiprocessing.Value("i", 1)
def run(self):
self.process = multiprocessing.Process(target=self.thing.worker, args=(self.running_flag,))
self.process.start()
print self.process.pid
def pause_resume(self):
self.running_flag.value = not self.running_flag.value
def terminate(self):
self.process.terminate()
class Thing(object):
def __init__(self):
self.count = 1
def worker(self,running_flag):
while True:
if running_flag.value:
self.do_work()
def do_work(self):
print "working {0} ...".format(self.count)
self.count += 1
time.sleep(1)
【问题讨论】:
-
我认为直接的答案是您不想终止您的进程 - 因为您发现它们变成了可能会占用内存或谁知道的僵尸。在我有限的多处理经验中,我对让工人能够优雅地死去更加警惕。 this answer 的主题基本相同吗?
-
不完全。我已经阅读了许多这样的线程,他们预计会发生异常,然后您可以处理它。我有一些东西正在运行但挂起的情况。操作员可能会发现某些东西运行不正确,我想要一种方法来停止该过程。由于它被挂起,它不会响应诸如通过 multiprocessing.Value() 发送停止标志之类的东西。很可能,他们会做的是杀死整个程序,然后重新启动它,所以我想知道在程序中是否有一个好的方法可以让子进程恢复。
-
我想我知道你的意思,但我找到的唯一答案仍然如上 - 你只需要尽你所能避免“挂起”(例如,一个包罗万象的异常包装每个进程)。作为进一步的证据,在许多情况下线程可以说是更简单的解决方案,it has the same advice。在这一点上,以防万一您还没有检查 - 确保您确实需要多处理而不是线程,因为每个都有自己的优点和缺点。
标签: python multiprocessing python-multiprocessing