python-3.x - 如何在python中使用父进程重新启动失败的进程
问题描述
代码:
execs = ['C:\\Users\\XYZ\\PycharmProjects\\Task1\\dist\\multiof1.exe',
'C:\\Users\\XYZ\\PycharmProjects\\Task2\\dist\\multiof2.exe',
'C:\\Users\\XYZ\\PycharmProjects\\Task3\\dist\\multiof3.exe',
'C:\\Users\\XYZ\\PycharmProjects\\failedprocess\\dist\\multiof4.exe'
]
print('Parent Process id : ', os.getpid())
process = [subprocess.Popen(exe) for exe in execs]
for proc in process:
proc.wait()
print('Child Process id : ', proc.pid)
if proc.poll() is not None:
if proc.returncode == 0:
print(proc.pid, 'Exited')
elif proc.returncode > 0:
print('Failed:', proc.pid)
在上面,.exe 的单子 .exe 将失败,我需要从父进程重新启动失败的 .exe。
我知道,上面的代码不是一个正确的实现,但我用谷歌搜索没有找到合适的解决方案。
任何支持都将帮助我了解有关子流程的更多信息。
解决方案
我的评论是这样的:
import subprocess
import time
execs = [
"C:\\Users\\XYZ\\PycharmProjects\\Task1\\dist\\multiof1.exe",
"C:\\Users\\XYZ\\PycharmProjects\\Task2\\dist\\multiof2.exe",
"C:\\Users\\XYZ\\PycharmProjects\\Task3\\dist\\multiof3.exe",
"C:\\Users\\XYZ\\PycharmProjects\\failedprocess\\dist\\multiof4.exe",
]
class WrappedProcess:
def __init__(self, exe):
self.exe = exe
self.process = None
self.success = False
def check(self):
if self.success: # Nothing to do, we're already successful.
return
if self.process is None: # No current process, start one.
print("Starting", self.exe)
self.process = subprocess.Popen(self.exe)
return # Only poll on next check
if self.process.poll() is None: # Not quit yet.
return
if self.process.returncode == 0:
print("Finished successfully:", self.exe)
self.success = True
else:
print("Failed:", self.exe)
# Abandon the process; next check() will retry.
self.process = None
wrapped_processes = [WrappedProcess(exe) for exe in execs]
while True:
for proc in wrapped_processes:
proc.check()
if all(proc.success for proc in wrapped_processes):
print("All processes ended successfully")
break
time.sleep(1)
在此处添加“最大时间”功能也很容易(启动新进程时,存储当前时间;check()
如果进程过期,则终止进程)。
推荐阅读
- python - 使用 slate 时出现 unicodeDecodeError
- ios - 增强混合应用程序中本地存储的弹性
- c - 如何开始使用指针和内存分配创建数据库
- spring-boot - 同一消息的 RabbitMQ 多个侦听器可防止重复侦听
- c# - 我怎样才能重新编写这段代码,以免看起来好像我正在使用异常作为流控制的一种形式?
- python - 如果字典为空,它如何在字典中搜索?
- css - 如何为图案填充添加背景颜色?
- json - 如何将可以在任何时间单位的持续时间添加到jq中的给定时间戳?
- python - 如何使用熊猫数据框的余额列计算银行对账单借方/贷方列?
- javascript - 如何在 Angular 中将“选择性输入”设置为表单字段?