Python进程间通信之共享内存详解


Posted in Python onOctober 30, 2017

前一篇博客说了怎样通过命名管道实现进程间通信,但是要在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)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现新浪博客备份的方法
Apr 27 Python
Python实现的概率分布运算操作示例
Aug 14 Python
使用python为mysql实现restful接口
Jan 05 Python
python正则表达式面试题解答
Apr 28 Python
Python异常处理操作实例详解
May 10 Python
使用PyQtGraph绘制精美的股票行情K线图的示例代码
Mar 14 Python
python中的单引号双引号区别知识点总结
Jun 23 Python
flask框架渲染Jinja模板与传入模板变量操作详解
Jan 25 Python
解决pycharm下pyuic工具使用的问题
Apr 08 Python
PyInstaller将Python文件打包为exe后如何反编译(破解源码)以及防止反编译
Apr 15 Python
解决Pytorch半精度浮点型网络训练的问题
May 24 Python
ROS系统将python包编译为可执行文件的简单步骤
Jul 25 Python
import的本质解析
Oct 30 #Python
python中hashlib模块用法示例
Oct 30 #Python
浅谈Python由__dict__和dir()引发的一些思考
Oct 30 #Python
Android分包MultiDex策略详解
Oct 30 #Python
Python 判断是否为质数或素数的实例
Oct 30 #Python
基于Python __dict__与dir()的区别详解
Oct 30 #Python
浅谈使用Python变量时要避免的3个错误
Oct 30 #Python
You might like
php清除和销毁session的方法分析
2015/03/19 PHP
php检查页面是否被百度收录
2015/10/28 PHP
Jquery 基础学习笔记之文档处理
2009/05/29 Javascript
菜鸟学习JavaScript小实验之函数引用
2010/11/17 Javascript
Script的加载方法小结
2011/01/12 Javascript
Jquery使用val方法读写value值
2015/05/18 Javascript
js读取并解析JSON类型数据的方法
2015/11/14 Javascript
基于jQuery1.9版本如何判断浏览器版本类型
2016/01/12 Javascript
ReactJs快速入门教程(精华版)
2016/11/28 Javascript
微信小程序 页面跳转传递值几种方法详解
2017/01/12 Javascript
Bootstrap学习笔记 轮播(Carousel)插件
2017/03/21 Javascript
vue+element实现批量删除功能的示例
2018/02/28 Javascript
JS实现DOM节点插入操作之子节点与兄弟节点插入操作示例
2018/07/30 Javascript
React 无状态组件(Stateless Component) 与高阶组件
2018/08/14 Javascript
微信小程序 组件的外部样式externalClasses使用详解
2019/09/06 Javascript
js DOM的事件常见操作实例详解
2019/12/16 Javascript
Vue实现导航栏菜单
2020/08/19 Javascript
原生js+css实现tab切换功能
2020/09/17 Javascript
使用Python获取Linux系统的各种信息
2014/07/10 Python
Python查找相似单词的方法
2015/03/05 Python
python使用mailbox打印电子邮件的方法
2015/04/30 Python
Python实现身份证号码解析
2015/09/01 Python
python实现域名系统(DNS)正向查询的方法
2016/04/19 Python
浅析Python 中整型对象存储的位置
2016/05/16 Python
PYTHON压平嵌套列表的简单实现
2016/06/08 Python
Python 列表(List) 的三种遍历方法实例 详解
2017/04/15 Python
基于Python List的赋值方法
2018/06/23 Python
python matplotlib库绘制条形图练习题
2019/08/10 Python
python导入不同目录下的自定义模块过程解析
2019/11/18 Python
python opencv 实现读取、显示、写入图像的方法
2020/06/08 Python
Python 如何对文件目录操作
2020/07/10 Python
英国森林假期:Forest Holidays
2021/01/01 全球购物
日语专业毕业生求职信
2013/12/04 职场文书
2015年南京大屠杀纪念日活动总结
2015/03/24 职场文书
有关西游记的读书笔记
2015/06/25 职场文书
土木工程生产实习心得体会
2016/01/22 职场文书