通过共享内存在多程序之间实现数据通信

注:以下内容为与 GPT-4O 共同创作完成

以共享内存的方式实现多程序之间的数据通信,尤其适合在一台机器上的多程序之间进行高频数据交换。

以下示例展示了 sender.py 向 receiver.py 发送数据并接收经 receiver.py 处理后的数据,以及如何通过事件驱动机制实现 receiver.py 等待 sender.py 的通知,避免了轮询共享内存,降低 CPU 使用率。

manager_server.py

import multiprocessing
multiprocessing.set_start_method("spawn", force=True)from multiprocessing.managers import BaseManager
from multiprocessing import Event# 定义共享事件对象
event_send = Event()
event_receive = Event()# 定义普通函数来返回事件对象
def get_event_send():return event_senddef get_event_receive():return event_receiveclass SharedManager(BaseManager):passdef main():# 注册共享事件对象SharedManager.register("get_event_send", callable=get_event_send)SharedManager.register("get_event_receive", callable=get_event_receive)# 启动 Manager 服务器manager = SharedManager(address=("localhost", 50000), authkey=b"password")print("Manager server is running...")manager.start()try:input("Press Enter to stop the server...\n")finally:manager.shutdown()if __name__ == "__main__":main()

sender.py

import time
import numpy as np
from multiprocessing import shared_memory
from multiprocessing.managers import BaseManagerclass SharedManager(BaseManager):passdef main():# 注册共享事件对象SharedManager.register("get_event_send")SharedManager.register("get_event_receive")# 连接到 Manager 服务器manager = SharedManager(address=("localhost", 50000), authkey=b"password")manager.connect()# 获取共享事件对象event_send = manager.get_event_send()event_receive = manager.get_event_receive()# 创建共享内存shm_send = shared_memory.SharedMemory(name="shared_data_send", create=True, size=1024)shm_receive = shared_memory.SharedMemory(name="shared_data_receive", create=True, size=1024)# 创建 NumPy 数组,绑定到共享内存data_send = np.ndarray((256,), dtype=np.float32, buffer=shm_send.buf)data_receive = np.ndarray((256,), dtype=np.float32, buffer=shm_receive.buf)try:while True:# 向共享内存写入数据data_send[:] = np.random.rand(256)  # 模拟发送的数据print("sender.py: Sent data to shared memory")# 通知 receiver.py 数据已写入event_send.set()# 等待 receiver.py 处理完成event_receive.wait()event_receive.clear()  # 重置事件# 读取处理后的数据print("sender.py: Received processed data:", data_receive[:5])  # 打印前 5 个数据# 等待 0.1 秒(10Hz)time.sleep(5)except KeyboardInterrupt:print("sender.py: Exiting...")finally:# 释放共享内存shm_send.close()shm_send.unlink()shm_receive.close()shm_receive.unlink()if __name__ == "__main__":main()

receiver.py

import time
import numpy as np
from multiprocessing import shared_memory
from multiprocessing.managers import BaseManagerclass SharedManager(BaseManager):passdef main():# 注册共享事件对象SharedManager.register("get_event_send")SharedManager.register("get_event_receive")# 连接到 Manager 服务器manager = SharedManager(address=("localhost", 50000), authkey=b"password")manager.connect()# 获取共享事件对象event_send = manager.get_event_send()event_receive = manager.get_event_receive()# 连接到共享内存shm_send = shared_memory.SharedMemory(name="shared_data_send")shm_receive = shared_memory.SharedMemory(name="shared_data_receive")# 创建 NumPy 数组,绑定到共享内存data_send = np.ndarray((256,), dtype=np.float32, buffer=shm_send.buf)data_receive = np.ndarray((256,), dtype=np.float32, buffer=shm_receive.buf)try:while True:# 等待 sender.py 的数据写入通知event_send.wait()event_send.clear()  # 重置事件# 从共享内存读取数据received_data = data_send.copy()  # 复制数据以避免直接操作共享内存print("receiver.py: Received data:", received_data[:5])  # 打印前 5 个数据# 模拟处理数据并写回共享内存data_receive[:] = received_data * 2print("receiver.py: Processed data written back to shared memory")# 通知 sender.py 数据已处理完成event_receive.set()except KeyboardInterrupt:print("receiver.py: Exiting...")finally:# 释放共享内存shm_send.close()shm_receive.close()if __name__ == "__main__":main()

以上3个脚本的运行步骤为:

1. 启动 manager_server.py,保持运行状态

2. 运行 sender.py

3. 运行 receiver.py

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/84551.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[论文阅读] 人工智能+软件工程 | 理解GitGoodBench:评估AI代理在Git中表现的新基准

理解GitGoodBench:评估AI代理在Git中表现的新基准 论文信息 GitGoodBench: A Novel Benchmark For Evaluating Agentic Performance On Git Tobias Lindenbauer, Egor Bogomolov, Yaroslav Zharov Cite as: arXiv:2505.22583 [cs.SE] 研究背景:当AI走进…

开源 java android app 开发(十二)封库.aar

文章的目的为了记录使用java 进行android app 开发学习的经历。本职为嵌入式软件开发,公司安排开发app,临时学习,完成app的开发。开发流程和要点有些记忆模糊,赶紧记录,防止忘记。 相关链接: 开源 java an…

ubuntu + nginx 1.26 + php7.4 + mysql8.0 调优

服务器配置 8核 16G 查看内存 free -h nginx配置 worker_processes auto; # 自动检测CPU核心数 worker_rlimit_nofile 65535; # 提高文件描述符限制 ​ events {worker_connections 8192; # 每个worker的最大连接数multi_accept on; # 一次性接受…

[未验证]abaqus2022 更改内置python

如何在 Abaqus 2022 中更改内置 Python 在 Abaqus 中,Python 是常用的脚本语言,它使得用户能够自动化模型的创建、分析和后处理。可能有时候你需要更改默认的 Python 版本,比如使用特定库或者功能。本文将为您详细说明如何在 Abaqus 2022 中更…

RAG文档解析难点2:excel数据“大海捞针”,超大Excel解析与精准行列查询指南

写在前面 在构建检索增强生成(RAG)应用时,Excel文件是不可或缺的数据源。它们通常包含了企业运营、市场分析、科学研究等各个领域的宝贵数据。然而,当这些Excel文件变得“超大”——可能包含数十万甚至数百万行数据时,传统的解析方法和RAG数据处理流程将面临严峻的内存、…

深度掌控,智启未来 —— 基于 STM32F103RBT6 的控制板

在科技浪潮奔涌向前的时代,电子领域的创新发展从未停歇。对于电子工程师、科研工作者以及电子技术爱好者,在校电子专业学生而言,一款性能卓越、功能全面且稳定可靠的开发板,是探索电子世界奥秘、实现创意构想的关键基石。今天&…

什么样的登录方式才是最安全的?

目录 一、基础协议:HTTP与HTTPS HTTP协议 HTTPS协议 二、常见Web攻击与防御 2.1 XSS 常见攻击手段 针对XSS 攻击窃取 Cookie 2.2 CSRF CSRF攻击的核心特点 与XSS的区别 常见防御措施 三、疑问解答 四、登录方式演变 4.1 方案一🐶狗都不用 …

android studio底部导航栏

实现底部导航栏切换 将java文件return的xml文件赋值给页面FrameLayout控件 java文件BottomNavigationView,监听器setOnNavigationItemSelectedListener MainActivity.java代码 package com.example.myapplication;import android.os.Bundle;import androidx.appc…

vue-router相关理解

一、前言 随着 Vue.js 在前端开发中的广泛应用,Vue Router 成为了 Vue 官方推荐的路由管理器。它不仅支持单页面应用(SPA)中常见的路由跳转、嵌套路由、懒加载等功能,还提供了导航守卫、动态路由等高级特性。 本文将带你深入了解…

uni-app 自定义路由封装模块详解(附源码逐行解读)

🚀uni-app 自定义路由封装模块详解(附源码逐行解读) 📌 请收藏 点赞 关注,获取更多 uni-app 项目实用技巧! 在实际 uni-app 项目中,我们常常需要对 uni.navigateTo、uni.switchTab 等 API 做…

QML显示图片问题解决办法

以前用qtwediget的时候,好像是放在qlabel或者什么组件上面,把图片的路径放上去就可以直接加载,但我用QML创建界面的时候就遇到了问题,哦对,qtwedget用qpixmap组件显示图片,也有image。话说回来,…

Vue中使用jsx

1. jsx的babel配置 1.1 在项目中使用jsx,需要添加对jsx的支持: jsx通常会通过Babel来进行转换(React编写的jsx就是通过babel转换的)Vue中,只需要在Babel中配置对应的插件即可以下列举需要支持转换的案例: template -> vue-l…

Spring Cache+Redis缓存方案 vs 传统redis缓存直接使用RedisTemplate 方案对比

结合 Spring Cache 和 Redis 的缓存方案(即 Spring Cache Redis)相较于普通的 Redis 缓存使用(如直接通过 RedisTemplate 操作),具有以下显著优势: 具体实现方案请参考:Spring CacheRedis缓存…

Web应用安全漏洞扫描:原理、常用方法及潜在风险解析?

Web应用安全的关键环节在于进行漏洞扫描,这种扫描通过自动化或半自动化的方式,对应用进行安全测试。它能揭示出配置错误、代码缺陷等众多安全风险。接下来,我将详细阐述这些情况。 扫描原理 它主要模拟攻击者的行为,以探测和攻击…

Spring中@Value注解:原理、加载顺序与实战指南

文章目录 前言一、Value注解的核心原理1.1 容器启动阶段:环境准备1.2 Bean实例化阶段:后置处理器介入1.3 值解析阶段:双引擎处理1. 占位符解析(${...})2. SpEL表达式解析(#{...}) 1.4 类型转换与…

MySQL 8配置文件详解

MySQL 8 配置文件详解 MySQL 8 的配置文件(my.cnf或my.ini)是MySQL服务器启动时读取的主要配置文件,它包含了服务器运行所需的各种参数设置。以下是MySQL 8配置文件的详细解析: 配置文件位置 MySQL 8 会按照以下顺序查找配置文件: /etc/m…

台湾住宅IP哪家好,怎么找到靠谱的海外住宅IP代理商

探索台湾住宅IP:如何找到靠谱的海外住宅IP代理商? 在当今数字化时代,海外住宅IP的需求日益增长,尤其在跨境电商、网络营销、数据抓取等领域。对于需要台湾住宅IP的用户来说,找到一家靠谱的海外住宅IP代理商至关重要。本…

读研一些毕业感想

回首过往三年,从踌躇迷茫到明晰坚定,从稚嫩懵懂到明理成熟,一切只觉轻舟已过万重山。 依稀记得我拉着行李箱跋山涉水来到学校的那天,早上从广东中山乘坐10小时高铁到北京西,然后坐1一个多小时地铁到学校&#x…

《飞算JavaAI:稳定、高效、跨平台的AI编程工具优势解析》

随着人工智能技术的不断发展,AI编程工具越来越成为开发者们在研究和应用AI模型时不可或缺的利器。国内外的AI编程工具多种多样,涵盖了从基础编程语言、框架到图形化界面的多种选择。然而,在这些工具中,飞算JavaAI作为一种基于Java…

day27/60重写(补充)

DAY 27 函数专题2:装饰器 ps:第一期day27对应5月16日 知识点回顾: 装饰器的思想:进一步复用函数的装饰器写法注意内部函数的返回值 作业: 编写一个装饰器 logger,在函数执行前后打印日志信息(如…