如何控制前一行代码执行完成后再运行下一行代码?
解决方案
首先明确:正常情况下os.system()是阻塞调用,会等待命令执行完成后才继续执行下一行代码。你遇到的问题,大概率是ok.py本身启动了后台进程后直接退出,导致os.system误判任务已完成,实际核心逻辑还在后台运行。
以下是几种更可靠的解决方式:
方式一:确保ok.py本身阻塞执行到任务结束
检查ok.py的代码,如果里面存在类似os.system("xxx &")、启动daemon进程或使用非阻塞多进程的逻辑,将其修改为阻塞式执行,让ok.py主进程直到所有任务完成后再退出。这种方式是最根本的解决方案。
方式二:用subprocess模块替代os.system(更可控)
subprocess比os.system提供了更精细的进程控制能力,默认也是阻塞等待子进程结束:
import flask import subprocess import multiprocessing as mp import torch def start_predictor(): # 阻塞等待ok.py执行完毕,check=True会在命令返回非0时抛出异常 subprocess.run(["python", "ok.py"], check=True) # 只有ok.py执行完成后才会执行这一行 subprocess.run(["python", "finish.py"], check=True) if __name__ == "__main__": torch.multiprocessing.set_start_method("spawn", True) predictor_server = mp.Process(target=start_predictor) predictor_server.daemon = True # 注意原代码拼写错误:deamon → daemon predictor_server.start()
方式三:追踪ok.py的整个进程树(无法修改ok.py时用)
如果无法修改ok.py,可以借助psutil库追踪ok.py启动的所有子进程,确保所有相关进程都结束后再执行finish.py:
- 先安装psutil:
pip install psutil - 修改代码如下:
import flask import subprocess import multiprocessing as mp import torch import psutil def wait_for_all_children(pid): try: parent_proc = psutil.Process(pid) # 获取所有递归子进程 all_children = parent_proc.children(recursive=True) # 等待父进程结束 parent_proc.wait() # 等待每个子进程结束 for child in all_children: child.wait() except psutil.NoSuchProcess: pass def start_predictor(): # 启动ok.py并获取进程对象 ok_proc = subprocess.Popen(["python", "ok.py"]) # 等待ok.py及其所有子进程完全结束 wait_for_all_children(ok_proc.pid) # 执行finish.py subprocess.run(["python", "finish.py"], check=True) if __name__ == "__main__": torch.multiprocessing.set_start_method("spawn", True) predictor_server = mp.Process(target=start_predictor) predictor_server.daemon = True predictor_server.start()
内容的提问来源于stack exchange,提问作者david129
相关产品推荐
相关产品推荐

