共享内存是python最快的ipc方式,允许多进程直接读写同一内存区域,避免拷贝,但需手动同步;常用multiprocessing.shared_memory(3.8+)和array/value(兼容旧版),必须配合lock防冲突,且需显式管理生命周期。

共享内存:最快但需手动同步
共享内存是Python中最快的IPC方式,多个进程直接读写同一块内存区域,避免数据拷贝。常用模块有multiprocessing.shared_memory(Python 3.8+)和multiprocessing.Array/Value(兼容老版本)。但它不提供自动锁机制,读写冲突风险高。
- 适合高频、小量结构化数据交换,如实时传感器采样值、状态标志位
- 必须配合Lock或Semaphore使用,否则极易出现脏读或覆盖写
- shared_memory需显式创建、绑定、关闭和销毁,忘记shm.close()和shm.unlink()会导致内存泄漏
队列与管道:安全易用的通用选择
multiprocessing.Queue和multiprocessing.Pipe封装了底层同步逻辑,开发者无需处理锁和缓冲区管理。Queue支持多生产者多消费者,Pipe更适合一对一高速通信。
- Queue基于管道+线程安全队列实现,内部使用_multiprocessing.Connection,可跨平台,但性能略低于Pipe
- Pipe返回一对连接对象(conn1, conn2),单向或双向通信均可,无额外序列化开销,适合大量连续数据流(如图像帧传输)
- 两者都要求传递的对象必须可被pickle序列化;含lambda、嵌套类实例、文件句柄等不可序列化对象会报错
消息队列与网络套接字:跨语言与分布式场景
当进程不在同一台机器、或需与非Python服务交互时,应跳出multiprocessing模块。推荐使用轻量级消息中间件或原生socket。
- Redis Pub/Sub或ZeroMQ适合松耦合、异步通信,支持发布订阅、请求响应等多种模式
- 标准socket(TCP/Unix domain socket)控制粒度最细,适合定制协议,Unix socket在本机通信时性能接近共享内存
- 避免直接用HTTP REST做高频IPC——启动开销大、序列化冗余、连接管理复杂
文件与信号量:简单场景下的补充方案
对性能不敏感、低频触发的协作,可用文件或信号量作为“协调开关”,而非真正传输数据。
立即学习“Python免费学习笔记(深入)”;
- 临时文件(如tempfile.NamedTemporaryFile)配合os.rename原子写入,可实现简单的任务通知或结果落盘
- multiprocessing.Semaphore和Event用于进程同步(如等待初始化完成),不传数据,仅传递状态
- 注意文件I/O的竞态问题:避免用open(..., 'w')直接覆盖,优先用重命名或flock加锁










