Python进程间通信之共享内存详解
作者:kongxx 发布时间:2022-01-06 05:47:10
标签:Python,进程通信,共享内存
前一篇博客说了怎样通过命名管道实现进程间通信,但是要在windows是使用命名管道,需要使用python调研windows api,太麻烦,于是想到是不是可以通过共享内存的方式来实现。查了一下,Python中可以使用mmap模块来实现这一功能。
Python中的mmap模块是通过映射同一个普通文件实现共享内存的。文件被映射到进程地址空间后,进程可以像访问内存一样对文件进行访问。
不过,mmap在linux和windows上的API有些许的不一样,具体细节可以查看mmap的文档。
下面看一个例子:
server.py
这个程序使用 test.dat 文件来映射内存,并且分配了1024字节的大小,每隔一秒更新一下内存信息。
import mmap
import contextlib
import time
with open("test.dat", "w") as f:
f.write('\x00' * 1024)
with open('test.dat', 'r+') as f:
with contextlib.closing(mmap.mmap(f.fileno(), 1024, access=mmap.ACCESS_WRITE)) as m:
for i in range(1, 10001):
m.seek(0)
s = "msg " + str(i)
s.rjust(1024, '\x00')
m.write(s)
m.flush()
time.sleep(1)
client.py
这个程序从上面映射的文件 test.dat 中加载数据到内存中。
import mmap
import contextlib
import time
while True:
with open('test.dat', 'r') as f:
with contextlib.closing(mmap.mmap(f.fileno(), 1024, access=mmap.ACCESS_READ)) as m:
s = m.read(1024).replace('\x00', '')
print s
time.sleep(1)
上面的代码可以在linux和windows上运行,因为我们明确指定了使用 test.dat 文件来映射内存。如果我们只需要在windows上实现共享内存,可以不用指定使用的文件,而是通过指定一个tagname来标识,所以可以简化上面的代码。如下:
server.py
import mmap
import contextlib
import time
with contextlib.closing(mmap.mmap(-1, 1024, tagname='test', access=mmap.ACCESS_WRITE)) as m:
for i in range(1, 10001):
m.seek(0)
m.write("msg " + str(i))
m.flush()
time.sleep(1)
client.py
import mmap
import contextlib
import time
while True:
with contextlib.closing(mmap.mmap(-1, 1024, tagname='test', access=mmap.ACCESS_READ)) as m:
s = m.read(1024).replace('\x00', '')
print s
time.sleep(1)
来源:http://www.jianshu.com/p/aaba9fa1e22f


猜你喜欢
- 当类间继承关系很简单时,super()的使用很简单。class A(object): def __init__(self): p
- 众所周知,我们可以通过索引值(或称下标)来查找序列类型(如字符串、列表、元组...)中的单个元素,那么,如果要获取一个索引区间的元素该怎么办
- 使用python完成超级基础的学生管理系统,供大家参考,具体内容如下说明:1、本学生管理系统非常非常简易,只有增,显,查,删,改功能,对于P
- 1、使用cmd打开命令行窗口。2、在输入python时,进入python交互模式。3、输入exit(),退出交互模式,在命令行模式下运行.p
- 第一章:霍夫变换检测圆① 实例演示1这个是设定半径范围 0-50 后的效果。② 实例演示2这个是设定半径范围 50-70 后的效果,因为原图
- 前段时间公司数据库服务器崩溃启动不起来,经过我初步排查是/home目录挂载不上导致启动不起来,虽然通过注释/etc/fstab中的挂载信息,
- mysql字段的数据类型支持json格式,可以直接存储json数组和json对象。一、插入json数据的方式有两种1、以普通字符串形式插入,
- ⭐️requests的使用(二)上一篇我们说了requests的简单用法,知道了如何发送请求,今天我们更深层次的来学习requests。我们
- 首先说明一点,每天的访问量并不大每天才2W的访问量,按道理说,访问量再增加一倍这样的服务器也应该足以承受。可是我们的服务器为什么总是这样频频
- 执行以下代码,发现无法跳出for循环:func SelectTest() { i := 0 for { select { case <
- Python-类属性,实例属性,类方法,静态方法,实例方法类属性和实例属性#coding:utf-8class Student(object
- Mysql的增删改查语句简单实现增加记录:insert into tablename(...) values(...)//如果增加的记录包括
- 一、个人安装环境1.Windows10x64_pro2.anaconda4.6.9 +python3.7.1(anaconda集成,不需单独
- 如何提高Request集合的使用效率?以加快程序处理速度: strTitle=Request.Form("Title&q
- 本文实例讲述了Python设计模式之组合模式原理与用法。分享给大家供大家参考,具体如下:组合模式(Composite Pattern):将对
- 专家解答 通过查询任何数据库中的三个系统表,你可以获得每个表的每一个字段的默认值。下面是这个核心查询。它返回分配给当前数据库中每个用户表的默
- 1.format() 基本用法python2.6 开始,新增了一种格式化字符串的函数str.format(),它增强了字符串格式化的功能基本
- 一、条件简化我们编写的查询语句的搜索条件本质上是一个表达式,这些表达式可能比较繁杂,或者不能高效的执行,MySQL的查询优化器会为我们简化这
- 总结常用基本点如下: 1、触发器有两种类型:数据定义语言触发器(DDL触发器)和数据操纵语言触发器(DML触发器)。 DDL触发器:在用户对
- 不过最近发现这个可视化操作有点点问题,就是当数据条数超过一定数目EMS SQL Manager就挂了,也不知道是否是软件问题……当然该开始我