如果崩溃,如何重新启动子进程?
how to restart subprocess if it crashes?
我试图在子进程崩溃时重新启动它,但不知为什么这个循环不起作用。我一直在想这是否可能?
def dont_stop(conv):
try:
subprocess.call(['python', 'main.py', str(conv)])
except:
dont_stop(conv)
if __name__ == '__main__':
proc = []
for conv in range(3,8):
p = multiprocessing.Process(name=f'p{conv}', target=dont_stop, args=(conv,))
p.start()
proc.append(p)
for p in proc:
p.join()
如果 运行ning 的程序以 non-standard 方式退出,subprocess.call
函数不会引发异常。它所做的只是 return 您告诉它的过程中的“return 代码”到 运行。对于正常退出的进程,通常是 0
,对于崩溃的程序,通常是其他值(non-zero 值的具体含义因程序和操作系统而异)。
这是一个简单的解决方案,它用一个循环替换您的递归代码,该循环检查子进程的 return 值:
def dont_stop(conv):
retval = 1
while retval != 0: # a return value of zero indicates a normal exit
retval = subprocess.call(['python', 'main.py', str(conv)])
另一种方法是停止使用 subprocess.call
并改用 subprocess.check_call
。该函数检查 return 代码并在它不为零时引发异常。虽然这通常是我们更喜欢的,但实际上这里有点丑。
def dont_stop(conv):
while True:
try:
subprocess.check_call(['python', 'main.py', str(conv)])
break
except subprocess.CalledProcessError:
# do logging here?
pass
由于您正在 运行ning 的程序也是一个 Python 程序,您可以考虑导入它,而不是 运行ning 在单独的解释器中。这可能会让您的 dont_stop
函数直接与 main.py
代码交互,例如捕获和记录异常。其细节在很大程度上取决于 main.py
的设计以及它应该做什么,因此我不会展示任何针对此方法的建议代码。
我试图在子进程崩溃时重新启动它,但不知为什么这个循环不起作用。我一直在想这是否可能?
def dont_stop(conv):
try:
subprocess.call(['python', 'main.py', str(conv)])
except:
dont_stop(conv)
if __name__ == '__main__':
proc = []
for conv in range(3,8):
p = multiprocessing.Process(name=f'p{conv}', target=dont_stop, args=(conv,))
p.start()
proc.append(p)
for p in proc:
p.join()
如果 运行ning 的程序以 non-standard 方式退出,subprocess.call
函数不会引发异常。它所做的只是 return 您告诉它的过程中的“return 代码”到 运行。对于正常退出的进程,通常是 0
,对于崩溃的程序,通常是其他值(non-zero 值的具体含义因程序和操作系统而异)。
这是一个简单的解决方案,它用一个循环替换您的递归代码,该循环检查子进程的 return 值:
def dont_stop(conv):
retval = 1
while retval != 0: # a return value of zero indicates a normal exit
retval = subprocess.call(['python', 'main.py', str(conv)])
另一种方法是停止使用 subprocess.call
并改用 subprocess.check_call
。该函数检查 return 代码并在它不为零时引发异常。虽然这通常是我们更喜欢的,但实际上这里有点丑。
def dont_stop(conv):
while True:
try:
subprocess.check_call(['python', 'main.py', str(conv)])
break
except subprocess.CalledProcessError:
# do logging here?
pass
由于您正在 运行ning 的程序也是一个 Python 程序,您可以考虑导入它,而不是 运行ning 在单独的解释器中。这可能会让您的 dont_stop
函数直接与 main.py
代码交互,例如捕获和记录异常。其细节在很大程度上取决于 main.py
的设计以及它应该做什么,因此我不会展示任何针对此方法的建议代码。