如何在指定时长后终止子进程?5秒终止嵌套调用进程且不修改子函数
解决5秒后终止所有进程的问题
我来帮你搞定这个问题,先拆解下你当前代码的核心bug:
你现在用os.system("python3 script2.py")调用子进程的方式是阻塞式的——script1会一直等着script2执行完才会继续往下走,而script2要跑几小时,所以你的while循环里的时间判断根本没机会执行,自然没法在5秒后触发终止逻辑。
解决方案思路
要实现需求,关键是让script1不被script2的运行阻塞,同时能监控时间到点后终止所有子进程,具体分两步:
- 用非阻塞方式启动script2子进程
- 到5秒后批量终止所有启动的子进程
针对“启动多个script2子进程,5秒后全部终止”的代码
import datetime import subprocess import os import signal import time def script1(arg): end_time = datetime.datetime.now() + datetime.timedelta(seconds=5) child_processes = [] # 存储所有启动的子进程对象 while datetime.datetime.now() < end_time: # 非阻塞启动script2,立刻返回子进程对象 proc = subprocess.Popen(["python3", "script2.py"]) child_processes.append(proc) time.sleep(0.1) # 加个小延迟,避免短时间内启动大量子进程(可选) # 时间到,终止所有子进程 for proc in child_processes: # 跨平台终止逻辑:Unix用SIGTERM,Windows用terminate() if os.name == 'posix': os.kill(proc.pid, signal.SIGTERM) else: proc.terminate() proc.wait() # 等待子进程确认终止 print("所有子进程已终止,主进程即将退出") if __name__ == "__main__": script1(None)
针对“只启动一个script2子进程,5秒后终止它”的简化代码
如果你的需求是只跑一个script2,5秒后停掉它,代码可以更简洁:
import datetime import subprocess import os import signal import time def script1(arg): end_time = datetime.datetime.now() + datetime.timedelta(seconds=5) # 启动单个子进程 proc = subprocess.Popen(["python3", "script2.py"]) # 循环等待到时间,加sleep减少CPU空转 while datetime.datetime.now() < end_time: time.sleep(0.1) # 终止子进程 if os.name == 'posix': os.kill(proc.pid, signal.SIGTERM) else: proc.terminate() proc.wait() print("子进程已终止") if __name__ == "__main__": script1(None)
关键知识点解释
subprocess.Popen是非阻塞调用:启动子进程后立刻返回,不会像os.system那样等着子进程跑完,这样script1才能正常执行时间监控逻辑。- 跨平台兼容:不同系统终止进程的方式不一样,代码里做了区分,保证在Windows和Linux/macOS都能正常工作。
- 避免CPU空转:循环里加
time.sleep(0.1)可以减少主进程的CPU占用,不然会一直空跑循环浪费资源。
内容的提问来源于stack exchange,提问作者Fin
相关产品推荐
相关产品推荐

