博主头像

272 千锋Python教程:1 19 7 进程间通信

外来客 • 2026-08-21 19:24:51

分享
𝕏 f
声明:本文为对公开视频内容的摘要整理, 未经本站独立核实,可能与原视频存在出入,不代表本站立场、观点或建议; 观点与版权归原作者及原平台所有。 如涉及版权问题,请联系我们,核实后立即删除。 [ 免责声明 ]

📚 进程间通信基础概念

  • 进程间通信(IPC)的核心场景是任务分工:一个进程负责生产数据(如下载文件),另一个进程负责消费数据(如保存文件)。
  • 这种模式允许并行处理,例如在边下载边保存的过程中,两个进程独立运行但需要交换数据。
  • 由于进程拥有独立的内存空间,直接通过变量传递数据不可行,必须借助共享对象进行通信。
  • 本教程使用 Python 的 `multiprocessing` 模块中的 `Queue`(队列)作为进程间通信的媒介。

🛠️ 代码实现步骤

  • 导入模块:从 `multiprocessing` 导入 `Process` 和 `Queue`,从 `time` 导入 `sleep`。
  • 定义任务函数
  • `download` 函数:模拟下载过程,遍历图片列表,打印下载状态,调用 `time.sleep` 模拟耗时,最后将图片名称放入队列(`q.put`)。
  • `get_file` 函数:从队列中获取数据(`q.get`),打印保存成功信息。
  • 创建队列:实例化一个 `Queue` 对象,该对象将被两个进程共用。
  • 创建进程
  • 实例化 `Process` 对象,指定 `target` 为对应的任务函数。
  • 通过 `args` 参数将共用的 `Queue` 对象传递给两个进程,确保它们引用同一个队列实例。
  • 启动进程:调用 `start()` 方法启动两个进程。
  • 等待进程结束:调用 `join()` 方法,确保主进程等待子进程执行完毕后再继续,防止资源提前回收。

⚠️ 关键注意事项与陷阱

  • 参数传递规范:创建进程时,`target` 参数必须传入函数名(不带括号),若传入函数调用结果则无法执行预期任务。
  • 队列阻塞机制:`Queue.get()` 默认是阻塞的。若队列中无数据,消费进程会一直等待,直到生产进程放入数据。
  • 资源回收风险:若主进程未调用 `join()` 等待子进程结束,主进程可能提前结束并回收内存,导致子进程中的队列对象失效,引发数据丢失或程序异常。
  • 无限循环处理:若消费进程使用 `while True` 循环不断取数据,会导致进程无法自然结束。
  • 解决方案:在 `get` 操作中设置 `timeout` 超时时间。
  • 异常处理:使用 `try-except` 捕获超时异常,当超时发生时执行 `break` 跳出循环,从而正常结束进程。
  • 文档阅读重要性:开发中遇到不熟悉的 API,应优先查阅官方文档(如 Python 3.6 文档),了解参数含义(如 `target`、`args`)及用法,而非仅依赖源码或猜测。

📝 核心结论

  • 进程间通信通过共享 `Queue` 对象实现,生产端 `put` 数据,消费端 `get` 数据。
  • 必须使用 `join()` 确保子进程完成,避免主进程提前退出导致资源回收。
  • 对于持续消费的进程,需结合 `timeout` 和异常处理机制来优雅地终止循环,防止程序挂起。

0 条评论

发表评论

请先 登录 后参与讨论。