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简单计算文件夹大小的方法
Jul 14 Python
Python实现的栈(Stack)
Jan 26 Python
python批量实现Word文件转换为PDF文件
Mar 15 Python
python利用requests库进行接口测试的方法详解
Jul 06 Python
详解如何管理多个Python版本和虚拟环境
May 10 Python
Python学习笔记之文件的读写操作实例分析
Aug 07 Python
原生python实现knn分类算法
Oct 24 Python
解决Django部署设置Debug=False时xadmin后台管理系统样式丢失
Apr 07 Python
python matplotlib:plt.scatter() 大小和颜色参数详解
Apr 14 Python
基于python检查矩阵计算结果
May 21 Python
python对一个数向上取整的实例方法
Jun 18 Python
python写文件时覆盖原来的实例方法
Jul 22 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作为Shell脚本语言使用
2006/10/09 PHP
fleaphp下不确定的多条件查询的巧妙解决方法
2008/09/11 PHP
jQuery 使用手册(六)
2009/09/23 Javascript
IE本地存储userdata的一个bug说明
2010/07/01 Javascript
javascript客户端遍历控件与获取父容器对象示例代码
2014/01/06 Javascript
关闭ie窗口清除Session的解决方法
2014/01/10 Javascript
jquery中validate与form插件提交的方式小结
2016/03/26 Javascript
JS字符串统计操作示例【遍历,截取,输出,计算】
2017/03/27 Javascript
vue axios数据请求get、post方法及实例详解
2018/09/11 Javascript
vue.js单文件组件中非父子组件的传值实例
2018/09/13 Javascript
electron + vue项目实现打印小票功能及实现代码
2018/11/25 Javascript
js使用swiper实现层叠轮播效果实例代码
2018/12/12 Javascript
vue框架制作购物车小球动画效果实例代码
2019/09/26 Javascript
[40:55]Liquid vs LGD 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
使用python统计文件行数示例分享
2014/02/21 Python
用Python实现通过哈希算法检测图片重复的教程
2015/04/02 Python
python计算圆周率pi的方法
2015/07/11 Python
python基于pygame实现响应游戏中事件的方法(附源码)
2015/11/11 Python
python3实现ftp服务功能(客户端)
2017/03/24 Python
Pycharm技巧之代码跳转该如何回退
2017/07/16 Python
对dataframe进行列相加,行相加的实例
2018/06/08 Python
python通过Windows下远程控制Linux系统
2018/06/20 Python
Django添加sitemap的方法示例
2018/08/06 Python
Django实现单用户登录的方法示例
2019/03/28 Python
python的pyecharts绘制各种图表详细(附代码)
2019/11/11 Python
pandas 像SQL一样使用WHERE IN查询条件说明
2020/06/05 Python
英国儿童图书网站:Scholastic
2017/03/26 全球购物
美国宠物用品网站:Value Pet Supplies
2018/03/17 全球购物
美国精油公司:Plant Therapy
2019/05/17 全球购物
NET程序员上机面试题
2015/05/23 面试题
师范生教师实习自我鉴定
2013/09/27 职场文书
超市促销活动总结
2014/07/01 职场文书
2015年社区妇联工作总结
2015/04/21 职场文书
Python OpenCV 彩色与灰度图像的转换实现
2021/06/05 Python
mysql sum(if())和count(if())的用法说明
2022/01/18 MySQL
MySQL数据库配置信息查看与修改方法详解
2022/06/25 MySQL