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中的测试模块unittest和doctest的使用教程
Apr 14 Python
在Python的Django框架中获取单个对象数据的简单方法
Jul 17 Python
探究python中open函数的使用
Mar 01 Python
Python zip()函数用法实例分析
Mar 17 Python
Python使用pip安装pySerial串口通讯模块
Apr 20 Python
pygame游戏之旅 调用按钮实现游戏开始功能
Nov 21 Python
python中多个装饰器的调用顺序详解
Jul 16 Python
Python 调用 Windows API COM 新法
Aug 22 Python
python安装virtualenv虚拟环境步骤图文详解
Sep 18 Python
Python利用全连接神经网络求解MNIST问题详解
Jan 14 Python
如何用python处理excel表格
Jun 09 Python
Keras: model实现固定部分layer,训练部分layer操作
Jun 28 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
高分R级DC动画剧《哈莉·奎茵》第二季正式预告首发
2020/04/09 欧美动漫
php cc攻击代码与防范方法
2012/10/18 PHP
PHP入门经历和学习过程分享
2014/04/11 PHP
Joomla使用Apache重写模式的方法
2016/05/04 PHP
使用YII2框架实现微信公众号中表单提交功能
2017/09/04 PHP
js中typeof的用法汇总
2013/12/12 Javascript
同域jQuery(跨)iframe操作DOM(示例代码)
2013/12/13 Javascript
jquery实现ajax提交form表单的方法总结
2014/03/03 Javascript
把jQuery的类、插件封装成seajs的模块的方法
2014/03/12 Javascript
js简单的点击返回顶部效果实现方法
2015/04/10 Javascript
js实现固定显示区域内自动缩放图片的方法
2015/07/18 Javascript
Javascript Event(事件)的传播与冒泡
2017/01/23 Javascript
ES6(ECMAScript 6)新特性之模板字符串用法分析
2017/04/01 Javascript
浅谈MUI框架中加载外部网页或服务器数据的方法
2018/01/31 Javascript
Nodejs 和 Electron ubuntu下快速安装过程
2018/05/04 NodeJs
详解React路由传参方法汇总记录
2020/11/29 Javascript
Python translator使用实例
2008/09/06 Python
python实现内存监控系统
2021/03/07 Python
python使用梯度下降算法实现一个多线性回归
2020/03/24 Python
Python PyQt5运行程序把输出信息展示到GUI图形界面上
2020/04/27 Python
Python替换NumPy数组中大于某个值的所有元素实例
2020/06/08 Python
基于Tensorflow读取MNIST数据集时网络超时的解决方式
2020/06/22 Python
美国第二大连锁书店:Books-A-Million
2017/12/28 全球购物
加拿大在线旅游公司:Flighthub
2019/03/11 全球购物
俄罗斯护发和专业化妆品购物网站:Hihair
2019/09/28 全球购物
static函数与普通函数有什么区别
2015/12/25 面试题
OSPF有什么优点?为什么OSPF比RIP收敛快?
2013/02/13 面试题
会计专业大学生求职信范文
2014/01/28 职场文书
旅游活动总结
2014/08/27 职场文书
付款承诺函范文
2015/01/21 职场文书
寒假社会实践个人总结
2015/03/06 职场文书
给朋友的赠语
2015/06/23 职场文书
文明礼仪主题班会
2015/08/13 职场文书
mysql知识点整理
2021/04/05 MySQL
MySQL深度分页(千万级数据量如何快速分页)
2021/07/25 MySQL
MySQL数据管理操作示例讲解
2022/12/24 MySQL