共享内存 - windows平台和linux平台的不同处理

1.各个平台下的共享内存的使用方法

共享内存主要用来进行模块分割,复杂性隔离的用途。python这类跨平台平台其实是无法完全消弭各个平台间的个体差异,一个简单的例子:

import posix_ipc
import mmap# 创建或打开共享内存
shm = posix_ipc.SharedMemory('/example', posix_ipc.O_CREAT, mode=0o666, size=100)# 映射共享内存到当前进程
shmmap = mmap.mmap(shm.fd, shm.size)# 在共享内存中写入数据
shmmap.write(b'Hello, shared memory!')# 在另一个进程中读取共享内存中的数据
shm2 = posix_ipc.SharedMemory('/example')
shmmap2 = mmap.mmap(shm2.fd, shm2.size)content = shmmap2.read()
content = content.rstrip(b'\x00');
print("%s" %content)  # 输出 b'Hello, shared memory!'# 释放共享内存
shmmap2.close()
shm2.close_fd()
shmmap.close()
shm.close_fd()
shm.unlink()

上面是linux下的共享内存使用一例,有多种途径,这是其中的一种。但是windows平台下,它是这样的:

from multiprocessing.shared_memory import SharedMemory
from typing import Iterator
from multiprocessing.managers import SharedMemoryManager
from multiprocessing import Process, Queue
import numpy as np
import uuid
import traceback
import time
from contextlib import contextmanager
import uuid#from process_call_func_test import child_process# 创建子进程,共享内存会被子进程继承
def child_process(name):print("child:",name)try:# 在子进程中访问共享内存数据shm = gp_shared_memory_open(name)shared_data = gp_shared_memory_get_uint8_of(shm)print(shared_data)shared_data = Noneshm.close()except Exception as e:traceback.print_exc()print(f"Exception in child process: {e}")print("child quit!")return 1976def gp_shared_memory_create(name, size):# 自行指定共享内存的名称shm_name = nameshm_size = sizeshm = SharedMemory(name=shm_name, create=True, size=shm_size)return shmdef gp_shared_memory_open(name):# 在子进程中访问共享内存数据shm_name = nameshm = SharedMemory(name=shm_name, create=False)return shmdef gp_shared_memory_get_uint8_of(shm) -> Iterator[SharedMemory]:# 在主进程中写入数据到共享内存ar = np.frombuffer(shm.buf, dtype=np.uint8);return ardef gp_shared_memory_close(shm):shm.close()def gp_get_a_randome_name():# 生成一个新的 GUIDnew_guid = uuid.uuid4()name = str(new_guid)return name# 创建子进程,共享内存会被子进程继承
def test_gp_shared_memory():if __name__ == "__main__":name = gp_get_a_randome_name()shm = gp_shared_memory_create(name, 16)buf_in_u8 = gp_shared_memory_get_uint8_of(shm)buf_in_u8[1] = 19buf_in_u8[2] = 76buf_in_u8 = None# 在子进程中访问共享内存数据# 启动子进程p = Process(target=child_process, args=(shm.name,))p.start()p.join(3.5)if p.is_alive():# 子进程尚未结束,进行相应的处理print("Child Process timeout...")# 可以尝试终止子进程p.terminate()# 等待子进程终止p.join()else:time.sleep(1.5)print("child proc done!")gp_shared_memory_close(shm)if __name__ == "__main__":test_gp_shared_memory()

Windows下面的multiprocessing库根本没有shardmemory这个子项, 它被放置在别的地方。

2.初步结论

Python乃至任何一个组织,都没有足够的能力把所有的差异,或大或小的沟渠填平,你只能适应。分歧是必然的,同步,和谐有,更可能没有。一些思维僵化的人无法在舒适圈外有效拓展认知。今天一清早被朋友数落了一句:你是错把风口当本事。。。

这个地方我卡了大概三个小时,老顽固们大部分工作时间,都耗在卡顿上。不是不行,是脑袋跟不上时代——其实就是不行。调试,代码实验,是小白型程序员的看家本领。

附录A 完整的linux下的shared memory封装

附带有测试例程(Usage)

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import traceback
import uuid
import posix_ipc
import mmap
import time
from multiprocessing import Processdef _gp_shared_memory_getmmap_of(shm):# 在主进程中写入数据到共享内存mmap_ret = mmap.mmap(shm.fd, shm.size);return mmap_retdef _gp_shared_memory_create(r_name, r_size):# 自行指定共享内存的名称shm_name = r_nameshm = posix_ipc.SharedMemory(shm_name, posix_ipc.O_CREAT, mode=0o666, size=r_size)mmap = _gp_shared_memory_getmmap_of(shm)return (shm, mmap)def _gp_shared_memory_open(name):# 自行指定共享内存的名称shm_name = nameshm = posix_ipc.SharedMemory(shm_name)mmap = _gp_shared_memory_getmmap_of(shm)return (shm, mmap)def gp_get_a_random_name():# 生成一个新的 GUIDnew_guid = uuid.uuid4()name = str(new_guid)return nameclass gp_shared_memory_owner:def __init__(self, r_name, r_size):if(r_name is None):r_name = gp_get_a_random_name()self._name = r_name(self._shm, self._mmap) = _gp_shared_memory_create(r_name, r_size)self._size = self._shm.sizedef getmmap(self):return self._mmapdef getname(self):return self._namedef getsize(self):return self._sizedef release(self):self._mmap.close()self._shm.close_fd()self._shm.unlink()self._name = Noneself._size = 0self._mmap = Noneself._shm = Noneclass gp_shared_memory_client:def __init__(self, r_name):self._name = r_name(self._shm, self._mmap) = _gp_shared_memory_open(r_name)self._size = self._shm.sizedef getmmap(self):return self._mmap;def getname(self):return self._name;def getsize(self):return self._size;def release(self):self._mmap.close()self._shm.close_fd()self._name = Noneself._size = 0self._mmap = Noneself._shm = None# 创建子进程,共享内存会被子进程继承
def test_child_process(name):print("child:",name)try:# 在子进程中访问共享内存数据shmClient = gp_shared_memory_client(name)content = shmClient.getmmap().read()content = content.rstrip(b'\x00');print("child process got msg: ", content)shmClient.release()except Exception as e:traceback.print_exc()print(f"Exception in child process: {e}")print("child quit!")return 1976# 创建子进程,共享内存会被子进程继承
def test_gp_shared_memory():if __name__ == "__main__":shmOwner1 = gp_shared_memory_owner(None,16)shmOwner1.getmmap().write(b'0x190x76')# 在子进程中访问共享内存数据# 启动子进程p = Process(target=test_child_process, args=(shmOwner1.getname(),))p.start()p.join(3.5)if p.is_alive():# 子进程尚未结束,进行相应的处理print("Child Process timeout...")# 可以尝试终止子进程p.terminate()# 等待子进程终止p.join()else:time.sleep(1.5)print("child proc done!")shmOwner1.release()if __name__ == "__main__":test_gp_shared_memory()

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

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

相关文章

matlab 坐标系变换

文章目录 对象轴角 axis-angles欧拉角 Euler angles四元数 quaternion旋转矩阵 rotation matrices齐次变换矩阵 Homogeneous Transformation坐标系换算 Coordinate Conversions图变换 Plot Transformations对象 对象含义se2SE(2)齐次变换矩阵se3SE(3)齐次变换矩阵so2SO(2)旋转s…

内存泄漏检查工具下载(vld)

前言:在我们向内存申请动态空间的时候,如果使用完之后不将申请的空间释放,就会造成内存泄漏的情况,但是一般情况下,我们是无法通过运行代码来知道是否造成了内存泄漏,所以vld就成为了检查内存是否泄漏的好帮…

rocketMQ中store目录解释

rocketMQ中有个store目录,它是用来存放和管理broker中的消息,queue和topic的。 下面的是store的目录 abort:该文件在broker启动后会自动创建,broker关闭后消失,若没有消失则说明该broker非正常关闭。 checkpoint&…

面向对象设计之开闭原则

设计模式专栏: http://t.csdnimg.cn/4Mt4u 目录 1.引言 2.如何理解“对扩展开放、对修改关闭” 3.修改代码就意味着违反开闭原则吗 4.如何做到“对扩展开放、对修改关闭” 5.如何在项目中灵活应用开闭原则 6.总结 1.引言 开闭原则(Open Closed Principle&…

Python多任务处理---多线程

引入 生活中,我们在电脑上打开了一个word, 这个word对操作系统来说就是一个进程。我们在进行word操作的时候,比如在你打字的时候,该word同时可以进行文字检查。发现了没,在同一个进程中,我们也可以进行同时操作。…

【RV1126】瑞芯微RV1126开发板双网口问题

今天新拿到瑞芯微RV1126的开发板,是双网口双百兆接口,内存为2G,emmc flash为32G,一开始无法分辨物理接口和系统的eth是对应的,遂想用ethtool工具来查看网速,发现: ethtool eth0 # 可以正常返回…

Acwing.731 毕业旅行问题(状态压缩动态规划)

题目 小明目前在做一份毕业旅行的规划。 打算从北京出发,分别去若干个城市,然后再回到北京,每个城市之间均乘坐高铁,且每个城市只去一次。 由于经费有限,小明希望能够通过合理的路线安排尽可能的省些路上的花销。 …

如何在 Debian VPS 上添加、删除和授予用户 sudo 权限

简介 当你启动一个新的服务器时,会创建一个名为 root 的默认账户。这个用户拥有完全的系统访问权限,应该仅用于管理任务。作为 root 用户,你基本上可以对系统做任何操作,这很强大,但也极其危险。Linux 没有“撤销”按…

Leetcode 73 矩阵置零

题目信息 LeetCode地址: . - 力扣(LeetCode) 题目理解 矩阵是m*n的,如果某个元素(i,j)等于0,则将第i行和第j列的所有元素都置零。既然如此,我们可以便利每一个元素,并记录下哪一行哪一列有零。记录完毕后…

【C++进阶】二叉搜索树(来自二叉树的复仇)

🪐🪐🪐欢迎来到程序员餐厅💫💫💫 主厨:邪王真眼 主厨的主页:Chef‘s blog 所属专栏:c大冒险 总有光环在陨落,总有新星在闪烁 [本节目标] 1. 二叉搜索树…

KaTex 常用公式编辑

原文:https://blog.iyatt.com/?p7854 注:语法上和 Latex 差不多一样,我是因为 WordPress 上使用 WP Githuber MD 插件,才用的 KaTex(插件里面的 LaTex 模块有 bug,无法渲染) 希腊字母 大写代…

MyBatis 参数重复打印的bug

现象 最近有个需求,需要在mybatis对数据库进行写入操作的时候,根据条件对对象中的某个值进行置空,然后再进行写入,这样数据库中的值就会为空了。 根据网上查看的资料,选择在 StatementHandler 类执行 update 的时候进…

C++之调用Python

1、配置头文件 Python安装目录下的include目录加入头文件目录。Visual Studio2022中操作路径是:属性–> C/C -> 常规-> 附加包含目录 C:\Users \AppData\Local\Programs\Python\Python39\include 2、配置lib库目录 要将Python39.lib加入编译链接。Visua…

neo4j使用详解(七、cypher数学函数语法——最全参考)

Neo4j系列导航: neo4j及简单实践 cypher语法基础 cypher插入语法 cypher插入语法 cypher查询语法 cypher通用语法 cypher函数语法 5.数学函数 5.1.数值函数 数学函数仅对数字表达式进行运算,如果对任何其他值使用,将返回错误 abs()&#xf…

Nginx 基础

文章目录 Nginx概念安装下载上传安装包执行准备条件指定安装位置编译和安装启动服务创建启动脚本 linux文件目录nginx运行原理nginx配置域名概念和原理域名配置 Nginx 概念 Nginx 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是…

【Java八股面试系列】Arraylist和HashMap的底层原理

文章目录 ArrayList源码总:构造方法扩容机制remove HashMap总:构造方法细节问题putVal()方法resize()方法Hash值 HashMap常见问题 ConcurrentHashMap总:putVal()方法自己的测试 为什么重写HashCode和equals ArrayList源码 总: *…

3.28号arm

can总线相关理论 1. 概念 控制器局域网(Controller Area Network,CAN),其特点是可拓展性好,可承受大量数据的高速通信,高度稳定可靠,因此常应用于汽车电子领域、工业自动化、医疗设备等高要求…

Java JSON字符串相关问题

一、依赖包 <!--json包--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.15</version></dependency> 二、举例 1.实体对象转Json字符串 1.1 代码实现 Dog.java: pack…

python_web1(前端开发之HTML、CSS、Bootstap、Javascript、JQuery)

文章目录 一、Flask网页开发1.1创建一个名为web1.py的python文件1.2 templates目录创建文件index.html 二、html标签2.1 编码2.2title < head >2.3 标题< h>2.4 div和span2.5超链接1.在index.xml文件中补充。2.修改web1.py文件3.添加get_self.html4.效果 2.6图片1.…

Java 堆外内存及调优

文章目录 直接内存简介为什么DirectByteBuffer可以优化 IO 性能 直接内存的分配直接内存的回收直接内存跟踪与诊断 直接内存简介 直接内存(Direct Memory) 并不是虚拟机运行时数据区的一部分&#xff0c;并非Java虚拟机规范中定义的内存区域。但是这部分内存的频繁使用&#x…