我有一个python multiprocessing
进程,它生成子进程以运行各种命令。我想将进程包装在另一个类中,如果父进程被终止,它将首先终止子进程。
这是我到目前为止所做的:
def f():
current_process = multiprocessing.current_process()
current_process.subprocess = subprocess.Popen(...) # execute command taking a lot of time to run.
class ProcessWrapper(Process):
def __init__(self, function):
super(ProcessWrapper, self).__init__(target=function)
def terminate(self):
if hasattr(self, 'subprocess'):
self.subprocess.terminate() # never gets here
super(ProcessWrapper, self).terminate()
def main():
p = ProcessWrapper(f)
p.start()
time.sleep(5)
p.terminate()
问题似乎是子进程永远不会附加到父进程。这是什么原因?实现这一目标的最佳方法是什么?
答案 0 :(得分:1)
为清楚起见,让我们使用以下术语:“父进程”是您开始的初始Python进程; “子进程”是您通过multiprocessing
模块启动的进程; “孙子过程”是您通过subprocess.Popen
开始的过程。
问题是您的f
是在子进程中执行的,但是当您调用terminate
实例的ProcessWrapper
方法时,您正在父进程中运行代码,其中subprocess
从未将multiprocessing.current_process()
属性分配给{{1}}返回的对象。
要执行您想要的操作,您可以使用process groups使父进程能够直接终止孙子进程,或者(作为更细粒度的手动方法)从父进程向子进程发送信号并拥有孩子中的信号处理程序终止了孙子。