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 29 Python
Python捕捉和模拟鼠标事件的方法
Jun 03 Python
在DigitalOcean的服务器上部署flaskblog应用
Dec 19 Python
Python的语言类型(详解)
Jun 24 Python
Python实现的生产者、消费者问题完整实例
May 30 Python
对Python subprocess.Popen子进程管道阻塞详解
Oct 29 Python
Python matplotlib通过plt.scatter画空心圆标记出特定的点方法
Dec 13 Python
Python安装tar.gz格式文件方法详解
Jan 19 Python
python可视化text()函数使用详解
Feb 11 Python
python redis存入字典序列化存储教程
Jul 16 Python
python和C++共享内存传输图像的示例
Oct 27 Python
去除python中的字符串空格的简单方法
Dec 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 多个submit提交表单 处理方法
2009/07/07 PHP
PHP用SAX解析XML的实现代码与问题分析
2011/08/22 PHP
zf框架的session会话周期及次数限制使用示例
2014/03/13 PHP
ThinkPHP实现ajax仿官网搜索功能实例
2014/12/02 PHP
php关键字仅替换一次的实现函数
2015/10/29 PHP
php源码 fsockopen获取网页内容实例详解
2016/09/24 PHP
模仿JQuery.extend函数扩展自己对象的js代码
2009/12/09 Javascript
Javascript变量函数浅析
2011/09/02 Javascript
document.documentElement的一些使用技巧
2013/04/18 Javascript
jQuery遍历页面所有CheckBox查看是否被选中的方法
2015/04/14 Javascript
javascript实现2016新年版日历
2016/01/25 Javascript
js操作DOM--添加、删除节点的简单实例
2016/07/08 Javascript
Jquery组件easyUi实现选项卡切换示例
2016/08/23 Javascript
Vue点击切换颜色的方法
2018/09/13 Javascript
如何优雅的在一台vps(云主机)上面部署vue+mongodb+express项目
2019/01/20 Javascript
vue 子组件修改data或调用操作
2020/08/07 Javascript
解决在Vue中使用axios POST请求变成OPTIONS的问题
2020/08/14 Javascript
vue 获取url参数、get参数返回数组的操作
2020/11/12 Javascript
[42:25]2018DOTA2亚洲邀请赛 4.5 淘汰赛 LGD vs Liquid 第三场
2018/04/06 DOTA
python中的计时器timeit的使用方法
2017/10/20 Python
Python3.4学习笔记之列表、数组操作示例
2019/03/01 Python
python爬虫简单的添加代理进行访问的实现代码
2019/04/04 Python
python实现微信每日一句自动发送给喜欢的人
2019/04/29 Python
python Django中models进行模糊查询的示例
2019/07/18 Python
简述python&pytorch 随机种子的实现
2020/10/07 Python
Python爬虫自动化爬取b站实时弹幕实例方法
2021/01/26 Python
英国PC组件和在线电脑商店:SCAN
2019/04/18 全球购物
大学教师年终总结的自我评价
2013/10/29 职场文书
市场营销职业生涯规划书范文
2014/01/12 职场文书
在校大学生个人的自我评价
2014/02/13 职场文书
2014院党委领导班子及其成员群众路线对照检查材料思想汇报
2014/10/04 职场文书
领导个人查摆剖析材料
2014/10/29 职场文书
交通事故一次性赔偿协议书范本
2014/11/02 职场文书
2014年小学少先队工作总结
2014/12/18 职场文书
机关保密工作承诺书
2015/05/04 职场文书
Java设计模式中的命令模式
2022/04/28 Java/Android