如果崩溃,如何重新启动子进程?

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 的设计以及它应该做什么,因此我不会展示任何针对此方法的建议代码。