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中使用PIL库实现图片高斯模糊实例
Feb 08 Python
Python标准库defaultdict模块使用示例
Apr 28 Python
Python argv用法详解
Jan 08 Python
python3设计模式之简单工厂模式
Oct 17 Python
python的re正则表达式实例代码
Jan 24 Python
Python实现PS滤镜特效Marble Filter玻璃条纹扭曲效果示例
Jan 29 Python
使用Python通过win32 COM打开Excel并添加Sheet的方法
May 02 Python
django实现更改数据库某个字段以及字段段内数据
Mar 31 Python
Python参数传递实现过程及原理详解
May 14 Python
Pytorch环境搭建与基本语法
Jun 03 Python
python如何快速生成时间戳
Jul 21 Python
详解Python为什么不用设计模式
Jun 24 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脚本的10个技巧(8)
2006/10/09 PHP
关于PHP实现异步操作的研究
2013/02/03 PHP
Yii2.0表关联查询实例分析
2016/07/18 PHP
PHP实现redis限制单ip、单用户的访问次数功能示例
2018/06/16 PHP
PHP集成环境XAMPP的安装与配置
2018/11/13 PHP
关于jQuery中的each方法(jQuery到底干了什么)
2014/03/05 Javascript
查找Oracle高消耗语句的方法
2014/03/22 Javascript
js常用系统函数用法实例分析
2015/01/12 Javascript
javascript实现点击按钮让DIV层弹性移动的方法
2015/02/24 Javascript
JavaScript设计模式初探
2016/01/07 Javascript
JavaScript function函数种类详解
2016/02/22 Javascript
基于Bootstrap实现图片轮播效果
2016/05/22 Javascript
浅谈JS中的三种字符串连接方式及其性能比较
2016/09/02 Javascript
前端实现文件的断点续传(前端文件提交+后端PHP文件接收)
2016/11/04 Javascript
jQuery实现根据身份证号获取生日、年龄、性别等信息的方法
2019/01/09 jQuery
jQuery内容过滤选择器与子元素过滤选择器用法实例分析
2019/02/20 jQuery
小程序:授权、登录、session_key、unionId的详解
2019/05/15 Javascript
python连接mysql实例分享
2016/10/09 Python
Python使用matplotlib绘图无法显示中文问题的解决方法
2018/03/14 Python
简单实现python聊天程序
2018/04/01 Python
Windows下anaconda安装第三方包的方法小结(tensorflow、gensim为例)
2018/04/05 Python
如何安装并使用conda指令管理python环境
2019/07/10 Python
解决Pytorch训练过程中loss不下降的问题
2020/01/02 Python
Python中的 ansible 动态Inventory 脚本
2020/01/19 Python
python 绘制场景热力图的示例
2020/09/23 Python
一个入门级python爬虫教程详解
2021/01/27 Python
空指针到底是什么
2012/08/07 面试题
应用心理学个人的求职信
2013/12/08 职场文书
煤矿机修工岗位职责
2014/02/07 职场文书
大学新学期计划书
2014/04/28 职场文书
2014年销售工作总结
2014/12/01 职场文书
2015年小学中秋节活动总结
2015/03/23 职场文书
放假通知范文
2015/04/14 职场文书
地道战观后感300字
2015/06/04 职场文书
出生证明格式
2015/06/15 职场文书
Go语言的协程上下文的几个方法和用法
2022/04/11 Golang