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实现命令行通讯录实例教程
Aug 18 Python
python验证码识别教程之利用投影法、连通域法分割图片
Jun 04 Python
Python hashlib模块用法实例分析
Jun 12 Python
PyTorch读取Cifar数据集并显示图片的实例讲解
Jul 27 Python
浅谈Python中eval的强大与危害
Mar 13 Python
Python 20行简单实现有道在线翻译的详解
May 15 Python
python Elasticsearch索引建立和数据的上传详解
Aug 04 Python
python实现矩阵和array数组之间的转换
Nov 29 Python
代码总结Python2 和 Python3 字符串的区别
Jan 28 Python
Django重设Admin密码过程解析
Feb 10 Python
Python过滤序列元素的方法
Jul 31 Python
python使用smtplib模块发送邮件
Dec 17 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无限分类的类
2007/01/02 PHP
php流量统计功能的实现代码
2012/09/29 PHP
基于PHP实现商品成交时发送短信功能
2016/05/11 PHP
thinkPHP3.2.3实现阿里大于短信验证的方法
2018/06/06 PHP
PHP优化之批量操作MySQL实例分析
2020/04/23 PHP
出现“不能执行已释放的Script代码”错误的原因及解决办法
2007/08/29 Javascript
jquery ui dialog里调用datepicker的问题
2009/08/06 Javascript
斜45度寻路实现函数
2009/08/20 Javascript
js 与或运算符 || && 妙用
2009/12/09 Javascript
jQuery timers计时器简单应用说明
2010/10/28 Javascript
js使用正则实现ReplaceAll全部替换的方法
2014/07/18 Javascript
JavaScript 函数模式详解及示例
2016/09/07 Javascript
详解js中==与===的区别
2017/01/08 Javascript
Vue-cli配置打包文件本地使用的教程图解
2018/08/02 Javascript
解决angularjs service中依赖注入$scope报错的问题
2018/10/02 Javascript
koa+mongoose实现简单增删改查接口的示例代码
2019/05/13 Javascript
javascript面向对象程序设计实践常用知识点总结
2019/07/29 Javascript
微信小程序 flexbox layout快速实现基本布局的解决方案
2020/03/24 Javascript
element中table高度自适应的实现
2020/10/21 Javascript
Python的socket模块源码中的一些实现要点分析
2016/06/06 Python
Python 基础之字符串string详解及实例
2017/04/01 Python
python与sqlite3实现解密chrome cookie实例代码
2018/01/20 Python
Python 判断 有向图 是否有环的实例讲解
2018/02/01 Python
Python2 Selenium元素定位的实现(8种)
2019/02/25 Python
Python数据库小程序源代码
2019/09/15 Python
浅谈Python程序的错误:变量未定义
2020/06/02 Python
浏览器实现移动端高性能css3动画(开启gpu加速)
2013/12/23 HTML / CSS
基于html5 canvas实现漫天飞雪效果实例
2014/09/10 HTML / CSS
在线服装零售商:SheIn
2016/07/22 全球购物
小学生田径运动会广播稿
2014/09/11 职场文书
机电专业毕业生自我鉴定2014
2014/10/04 职场文书
听证通知书
2015/04/24 职场文书
有关浪费资源的建议书
2015/09/14 职场文书
2019年中学生的思想品德评语集锦
2019/12/19 职场文书
5行Python代码实现一键批量扣图
2021/06/29 Python
Python四款GUI图形界面库介绍
2022/06/05 Python