You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

进程与子进程通信问题:主进程如何等待子进程完成?

嘿,我来帮你搞定这个多进程的问题~

首先直接点出核心:你确实漏掉了多进程里一个关键的基础概念——父进程和子进程的执行是异步的,默认情况下父进程不会主动等待子进程完成,而是会继续往下跑,这就导致了你看到的执行顺序混乱。

怎么让主进程等待子进程完成?

解决方法很简单,就是调用子进程对象的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

火山引擎 最新活动