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操作字典类型的常用方法(推荐)
May 16 Python
python学习 流程控制语句详解
Jun 01 Python
Python中__init__.py文件的作用详解
Sep 18 Python
详谈在flask中使用jsonify和json.dumps的区别
Mar 26 Python
pygame游戏之旅 按钮上添加文字的方法
Nov 21 Python
用Python编写一个高效的端口扫描器的方法
Dec 20 Python
对python多线程中互斥锁Threading.Lock的简单应用详解
Jan 11 Python
Python实现将HTML转成PDF的方法分析
May 04 Python
python 内置函数汇总详解
Sep 16 Python
python ffmpeg任意提取视频帧的方法
Feb 21 Python
python实现黄金分割法的示例代码
Apr 28 Python
Python 高级库15 个让新手爱不释手(推荐)
May 15 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&java(二)
2006/10/09 PHP
php 8小时时间差的解决方法小结
2009/12/22 PHP
PHP 5.3 下载时 VC9、VC6、Thread Safe、Non Thread Safe的区别分析
2011/03/28 PHP
linux下使用ThinkPHP需要注意大小写导致的问题
2011/08/02 PHP
在Laravel5.6中使用Swoole的协程数据库查询
2018/06/15 PHP
asp函数split()对应php函数explode()
2019/02/27 PHP
浅谈laravel-admin form中的数据,在提交后,保存前,获取并进行编辑
2019/10/21 PHP
Jquery 设置标题的自动翻转
2009/10/03 Javascript
jQuery创建插件的代码分析
2011/04/14 Javascript
jquery $.ajax相关用法分享
2012/03/16 Javascript
jquery.validate的使用说明介绍
2013/11/12 Javascript
JS脚本defer的作用示例介绍
2014/01/02 Javascript
jquery 无限级下拉菜单的简单实现代码
2014/02/21 Javascript
js中settimeout方法加参数的使用实例
2014/02/27 Javascript
Angular 2应用的8个主要构造块有哪些
2016/10/17 Javascript
JavaScript实现页面无操作倒计时退出
2016/10/22 Javascript
10分钟掌握XML、JSON及其解析
2020/12/06 Javascript
JS中事件冒泡和事件捕获介绍
2016/12/13 Javascript
js如何判断是否在iframe中及防止网页被别站用iframe嵌套
2017/01/11 Javascript
Vue.js render方法使用详解
2017/04/05 Javascript
jQuery实现所有验证通过方可提交的表单验证
2017/11/21 jQuery
vue系列之requireJs中引入vue-router的方法
2018/07/18 Javascript
详解react阻止无效重渲染的多种方式
2018/12/11 Javascript
详解mpvue中使用vant时需要注意的onChange事件的坑
2019/05/16 Javascript
Angular6项目打包优化的实现方法
2019/12/15 Javascript
[02:09:59]火猫TV国士无双dota2 6.82版本详解(下)
2014/09/29 DOTA
Python json模块使用实例
2015/04/11 Python
简单介绍利用TK在Python下进行GUI编程的教程
2015/04/13 Python
Python 实现一个颜色色值转换的小工具
2016/12/06 Python
对dataframe数据之间求补集的实例详解
2019/01/30 Python
基于Python爬取51cto博客页面信息过程解析
2020/08/25 Python
自我鉴定范文200字
2013/10/02 职场文书
大学生求职自我评价
2014/01/16 职场文书
优秀志愿者事迹材料
2014/02/03 职场文书
公司保密管理制度
2015/08/04 职场文书
2016领导干部廉洁自律心得体会
2016/01/13 职场文书