如果子行程崩潰,我正在嘗試重新啟動它,但是為什么這個回圈不起作用。我一直在想這是否可能?
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()
uj5u.com熱心網友回復:
subprocess.call如果該函式正在運行的程式以非標準方式退出,則該函式不會引發例外。它所做的只是從您告訴它運行的行程回傳“回傳代碼”。這通常0用于正常退出的行程,以及用于崩潰的程式的其他值(非零值的具體含義因程式和作業系統而異)。
這是一個簡單的解決方案,它用檢查子行程回傳值的回圈替換您的遞回代碼:
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改為使用。該函式檢查回傳碼,如果不為零則引發例外。雖然這通常是我們更喜歡的,但這里實際上有點丑陋。
def dont_stop(conv):
while True:
try:
subprocess.check_call(['python', 'main.py', str(conv)])
break
except subprocess.CalledProcessError:
# do logging here?
pass
由于您正在運行的程式也是 Python 程式,因此您可能會考慮將其匯入,而不是在單獨的解釋器中運行它。這可能會讓您的dont_stop函式直接與main.py代碼互動,例如捕獲和記錄例外。其細節過于依賴于它的設計main.py和它應該做什么,所以我不打算展示這種方法的任何建議代碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/470122.html
