进程与子进程通信问题:主进程如何等待子进程完成?
嘿,我来帮你搞定这个多进程的问题~
首先直接点出核心:你确实漏掉了多进程里一个关键的基础概念——父进程和子进程的执行是异步的,默认情况下父进程不会主动等待子进程完成,而是会继续往下跑,这就导致了你看到的执行顺序混乱。
怎么让主进程等待子进程完成?
解决方法很简单,就是调用子进程对象的join()方法,它会阻塞父进程,直到这个子进程完全执行完毕,再继续父进程的后续逻辑。
我把你的代码补全并修正了(你之前的subprocess部分没写完),给你一个完整的可运行示例:
#!/usr/bin/env python import multiprocessing import subprocess def run_command(): # 先输出你预期的内容 print("hello number") # 执行ls -l并获取输出 pipe = subprocess.Popen("ls -l", stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) out, err = pipe.communicate() # 用communicate安全获取输出,避免死锁 # 打印命令输出 print(out.decode('utf-8')) # 如果有错误输出也打印出来 if err: print(f"错误信息:{err.decode('utf-8')}") if __name__ == "__main__": # 创建子进程,指定要执行的函数 child_process = multiprocessing.Process(target=run_command) # 启动子进程 child_process.start() # 关键一步:让主进程等待子进程执行完成 child_process.join() # 子进程完成后,主进程再继续 print("主进程结束")
再给你补补多进程的基础知识点
- 当你调用
start()时,子进程才会真正开始执行,此时父进程不会停下,会继续执行start()之后的代码 join()方法的作用就是“同步”父进程和子进程:让父进程暂停,直到子进程跑完- 如果不加
join(),父进程可能在子进程还没输出内容的时候就已经结束了,或者输出顺序完全混乱 - 另外用
subprocess时,优先用communicate()来获取输出,比直接读stdout更安全,能避免子进程输出缓冲区满导致的死锁问题
这样修改后,程序就会严格按照你预期的顺序执行:先输出hello number,再执行ls -l并显示结果,最后主进程结束。
内容的提问来源于stack exchange,提问作者user765443




