Python 监视一个进程,并在失败时重新启动它



考虑这个工作代码:

from multiprocessing import Process
from updaters import app1, app2
if __name__ == '__main__':
    apps = [ app1, app2]  
    for app in apps:
        instance = app()
        p = Process(target=instance.start_listener)
        p.start()
        p.join()

这工作正常,直到一个进程失败(假设一些异常) - 如何 我可以通过编程方式监视进程并在失败时重新启动它

轮询 Process.is_alive(),如果它返回 False,则删除进程并启动一个新进程,例如:

from multiprocessing import Process
from updaters import app1, app2
from time import sleep
if __name__ == '__main__':
    apps = [app1, app2]  
    processes = {}
    n = 0
    for app in apps:
        instance = app()
        p = Process(target=instance.start_listener)
        p.start()
        processes[n] = (p, app) # Keep the process and the app to monitor or restart
        n += 1
    while len(processes) > 0:
        for n in processes.keys():
            (p, a) = processes[n]
            sleep(0.5)
            if p.exitcode is None and not p.is_alive(): # Not finished and not running
                 # Do your error handling and restarting here assigning the new process to processes[n]
                 print(a, 'is gone as if never born!')
            elif p.exitcode < 0:
                print ('Process Ended with an error or a terminate', a)
                # Handle this either by restarting or delete the entry so it is removed from list as for else
            else:
                print (a, 'finished')
                p.join() # Allow tidyup
                del processes[n] # Removed finished items from the dictionary 
                # When none are left then loop will end
print ('FINISHED')

相关内容

最新更新