当前位置: 首页 > news >正文

两个python独立进程通信

在 Python 3 中,两个独立的 Python 文件(进程)可以通过 multiprocessing.Queue 进行通信,但需要注意 跨进程队列的实现方式。以下是具体方法和注意事项:

场景解决方案优缺点
父子进程multiprocessing.Queue高效,但需通过父进程传递队列。
独立进程(同主机)multiprocessing.Manager().Queue()简单,但性能较低,需保持管理器运行。
跨机器/高并发Redis/RabbitMQ高性能,但需额外部署中间件。

选择建议

  1. 如果两个文件由同一脚本启动 → 方法 1

  2. 如果需要分布式通信 → 方法 3


方法 1:父子进程共享队列

在 Python 3 中,可以通过一个 父进程 启动两个子进程(对应两个 Python 文件),并共享同一个 multiprocessing.Queue,实现进程间通信。以下是具体实现方法:


1.1 直接使用 multiprocessing.Process 启动子进程

步骤

  1. 父进程 创建一个 multiprocessing.Queue()

  2. 父进程 启动两个子进程(producer.py 和 consumer.py),并将队列作为参数传递。

  3. 子进程 通过队列进行通信。

代码示例

父进程 (main.py)

import multiprocessing
import os
from producer import producer  # 导入 producer 函数
from consumer import consumer  # 导入 consumer 函数if __name__ == "__main__":# 1. 创建共享队列queue = multiprocessing.Queue()# 2. 启动生产者进程p_producer = multiprocessing.Process(target=producer,args=(queue,))p_producer.start()# 3. 启动消费者进程p_consumer = multiprocessing.Process(target=consumer,args=(queue,))p_consumer.start()# 4. 等待子进程结束p_producer.join()p_consumer.join()print("All processes finished.")

生产者 (producer.py)

import timedef producer(queue):for i in range(5):queue.put(f"Message {i}")  # 发送数据print(f"Produced: Message {i}")time.sleep(1)queue.put(None)  # 发送结束信号

消费者 (consumer.py)

def consumer(queue):while True:item = queue.get()  # 接收数据if item is None:  # 检查结束信号breakprint(f"Consumed: {item}")

1.2 使用 import + if __name__ == "__main__" 直接运行

如果不想用 main.py,可以直接在 生产者 或 消费者 文件中启动另一个进程:

修改 producer.py 以启动 consumer.py

import multiprocessing
import time
from consumer import consumer  # 导入 consumer 函数def producer(queue):for i in range(5):queue.put(f"Message {i}")print(f"Produced: Message {i}")time.sleep(1)queue.put(None)  # 发送结束信号if __name__ == "__main__":queue = multiprocessing.Queue()# 启动消费者进程p_consumer = multiprocessing.Process(target=consumer,args=(queue,))p_consumer.start()# 运行生产者(当前进程)producer(queue)# 等待消费者结束p_consumer.join()print("All done.")

关键注意事项

  1. if __name__ == "__main__" 是必需的: 避免 Windows 系统下的 multiprocessing 问题(子进程重新执行代码)。

  2. 队列传递方式:  multiprocessing.Queue 必须由 父进程创建,然后传递给子进程。

  3. 终止信号: 通常用 None 或特殊标记(如 "STOP")通知消费者终止。

  4. 避免死锁: 如果队列满,queue.put() 会阻塞,可以设置 maxsize

    queue = multiprocessing.Queue(maxsize=10) # 限制队列大小
  5. 跨文件导入: 确保 producer.py 和 consumer.py 在 同一目录,或正确设置 PYTHONPATH

方法适用场景优点缺点
父进程 (main.py)需要清晰控制多个子进程结构清晰,易于扩展需要额外的主控文件
单文件启动快速测试生产者-消费者模型代码更紧凑逻辑耦合,不易维护

推荐 方法 1main.py 方式),适用于正式项目,便于管理和扩展。

1.3 错误示例

文件 1: producer.py(生产者)

import multiprocessing
import timedef producer(queue):for i in range(5):queue.put(f"Message {i}")time.sleep(1)if __name__ == "__main__":queue = multiprocessing.Queue()p = multiprocessing.Process(target=producer, args=(queue,))p.start()p.join()  # 等待子进程结束

文件 2: consumer.py(消费者)

import multiprocessingdef consumer(queue):while True:item = queue.get()if item is None:  # 终止信号breakprint("Received:", item)if __name__ == "__main__":# 注意:队列必须通过父进程传递,不能直接重新创建queue = multiprocessing.Queue()  # 错误!这是另一个独立队列# 正确做法:通过父进程启动并传递队列(见下文)

关键问题

  • 直接分别在两个文件中创建 multiprocessing.Queue() 是无效的,因为它们是两个独立的进程,队列不共享。

  • 正确方式:需要通过一个 父进程 启动这两个文件,并将队列作为参数传递。


方法 2:使用第三方工具

如果需要高性能或跨机器通信,建议用外部消息队列:

  • Redisredis-py 的 r = redis.Redis(); r.lpush/r.brpop

  • RabbitMQpika 库实现 AMQP 协议。

Redis生产者

import redis
r = redis.Redis()
r.lpush("my_queue", "Hello from Producer!")

Redis消费者

import redis
r = redis.Redis()
while True:msg = r.brpop("my_queue")print("Received:", msg[1].decode())

http://www.lqws.cn/news/470359.html

相关文章:

  • Kubernetes 节点故障自愈方案:结合 Node Problem Detector 与自动化脚本
  • Java面试题025:一文深入了解数据库Redis(1)
  • 自定义 Hook:在 Vue3 中复用逻辑
  • Vue3 + TypeScript + xlsx 导入excel文件追踪数据流转详细记录(从原文件到目标数据)
  • Vue+spring boot前后端分离项目搭建---小白入门
  • 2025云服务器磁盘空间告急全解析:日志管理策略与智能扩容方案
  • 98. 验证二叉搜索树
  • Redis哨兵模式的学习(三)
  • React JSX语法
  • Hologres 使用 FDW
  • 「Linux文件及目录管理」输入输出重定向与管道
  • 网络编程及原理(六):三次握手、四次挥手
  • 什么是跨域问题?后端如何解决跨域问题?
  • 基于FPGA的白噪声信号发生器verilog实现,包含testbench和开发板硬件测试
  • ffmpeg(六):图片与视频互转命令
  • Python编程语言:2025年AI浪潮下的技术统治与学习红利
  • python的校园兼职系统
  • 分享两个可以一键生成sql server数据库 html格式巡检报告的脚本
  • 张之瞳全新单曲《6:30am》上线:以音乐定格青春遗憾中的诗意守望
  • Python 邻接表详细实现指南
  • 【软考高级系统架构论文】论面向服务架构设计及其应用
  • 【设计模式】6.原型模式
  • Git 使用手册:从入门到精通
  • 海光x86与Intel/AMD x86的差异解析:技术演进、架构博弈与未来之路
  • 通过 Lambda + API Gateway + 外部 API 实现。
  • 国产通用智能语音芯片品牌有哪些?
  • 树莓派无源蜂鸣器播放两首音乐实验指导书
  • python模块常用语法sys、traceback、QApplication
  • (LeetCode 面试经典 150 题) 169. 多数元素(哈希表 || 二分查找)
  • Java集合框架初识