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使用pyodbc访问数据库操作方法详解
Jul 05 Python
Python list列表中删除多个重复元素操作示例
Feb 27 Python
Python、 Pycharm、Django安装详细教程(图文)
Apr 12 Python
Python闭包和装饰器用法实例详解
May 22 Python
Flask框架工厂函数用法实例分析
May 25 Python
python Django里CSRF 对应策略详解
Aug 05 Python
Python根据服务获取端口号的方法
Sep 25 Python
python 连续不等式语法糖实例
Apr 15 Python
Python替换NumPy数组中大于某个值的所有元素实例
Jun 08 Python
详细分析Python collections工具库
Jul 16 Python
Python 在函数上添加包装器
Jul 28 Python
python-for x in range的用法(注意要点、细节)
May 10 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
终于听上了直流胆调频
2021/03/02 无线电
PHP函数import_request_variables()用法分析
2016/04/02 PHP
PHP实现双链表删除与插入节点的方法示例
2017/11/11 PHP
PDO::lastInsertId讲解
2019/01/29 PHP
javascript下判断一个对象是否具有指定名称的属性的的代码
2010/01/11 Javascript
在Javascript里访问SharePoint列表数据的实现方法
2011/05/22 Javascript
javascript检测浏览器flash版本的实现代码
2011/12/06 Javascript
JavaScript中valueOf函数与toString方法深入理解
2012/12/02 Javascript
原生Js实现元素渐隐/渐现(原理为修改元素的css透明度)
2013/06/24 Javascript
固定表格行列(expression)在IE下适用
2013/07/25 Javascript
IE下通过a实现location.href 获取referer的值
2014/09/04 Javascript
深入理解JavaScript系列(50):Function模式(下篇)
2015/03/04 Javascript
JS+HTML5实现上传图片预览效果完整实例【测试可用】
2017/04/20 Javascript
VUE2实现事件驱动弹窗示例
2017/10/21 Javascript
详解node.js的http模块实例演示
2018/07/12 Javascript
webpack的pitching loader详解
2019/09/23 Javascript
JavaScript中的惰性载入函数及优势
2020/02/18 Javascript
python版本坑:md5例子(python2与python3中md5区别)
2017/06/20 Python
Cython编译python为so 代码加密示例
2019/12/23 Python
python从内存地址上加载python对象过程详解
2020/01/08 Python
python字符串下标与切片及使用方法
2020/02/13 Python
Pytorch实现将模型的所有参数的梯度清0
2020/06/24 Python
Python如何执行系统命令
2020/09/23 Python
size?德国官方网站:英国伦敦的球鞋精品店
2018/03/17 全球购物
Fox Racing官方网站:越野摩托车和山地自行车装备和服装
2019/12/23 全球购物
如何利用find命令查找文件
2016/11/18 面试题
应届生的求职推荐信范文
2013/11/30 职场文书
初中体育教学反思
2014/01/14 职场文书
学习决心书
2014/03/11 职场文书
部门年终奖分配方案
2014/05/07 职场文书
项目委托协议书(最新)
2014/09/13 职场文书
大学生心理健康活动总结
2015/05/08 职场文书
2016年秋季运动会加油稿
2015/12/21 职场文书
2016年领导干部廉政承诺书
2016/03/24 职场文书
导游词之宿迁乾隆行宫
2019/10/15 职场文书
关于感恩的素材句子(38句)
2019/11/11 职场文书