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 05 Python
Python+MongoDB自增键值的简单实现
Nov 04 Python
python探索之BaseHTTPServer-实现Web服务器介绍
Oct 28 Python
Python后台开发Django会话控制的实现
Apr 15 Python
解决Django中多条件查询的问题
Jul 18 Python
pandas 缺失值与空值处理的实现方法
Oct 12 Python
解决Python中回文数和质数的问题
Nov 24 Python
python列表推导式入门学习解析
Dec 02 Python
动态设置django的model field的默认值操作步骤
Mar 30 Python
PyPDF2读取PDF文件内容保存到本地TXT实例
May 12 Python
如何解决.cuda()加载用时很长的问题
May 24 Python
Python中非常使用的6种基本变量的操作与技巧
Mar 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
四月新番又没了,《Re:从零开始的异世界生活》第二季延期至7月播出
2020/05/06 日漫
PHP调用JAVA的WebService简单实例
2014/03/11 PHP
php清空(删除)指定目录下的文件,不删除目录文件夹的实现代码
2014/09/04 PHP
php中header跳转使用include包含解决参数丢失问题
2015/05/08 PHP
非常全面的php日期时间运算汇总
2015/11/04 PHP
Yii 2中的load()和save()示例详解
2017/08/03 PHP
PHP分页显示的方法分析【附PHP通用分页类】
2018/05/10 PHP
PHP开发实现快递查询功能详解
2019/04/08 PHP
PHP swoole和redis异步任务实现方法分析
2019/08/12 PHP
在phpstudy集成环境下的nginx服务器下配置url重写
2019/12/02 PHP
PHP连续签到功能实现方法详解
2019/12/04 PHP
js的with语句使用方法
2007/09/21 Javascript
jquery动态加载图片数据练习代码
2011/08/04 Javascript
HTML中使背景图片自适应浏览器大小实例详解
2017/04/06 Javascript
微信小程序实现全国机场索引列表
2018/01/31 Javascript
Vue filter介绍及详细使用
2018/04/04 Javascript
JavaScript捕捉事件和阻止冒泡事件实例分析
2018/08/03 Javascript
vue实现打地鼠小游戏
2020/08/21 Javascript
[02:59]2014DOTA2西雅图国际邀请赛 圆满落幕中国夺冠
2014/07/23 DOTA
python 实现12bit灰度图像映射到8bit显示的方法
2019/07/08 Python
Django项目创建到启动详解(最全最详细)
2019/09/07 Python
Python根据服务获取端口号的方法
2019/09/25 Python
Python数据可视化处理库PyEcharts柱状图,饼图,线性图,词云图常用实例详解
2020/02/10 Python
Python 日期时间datetime 加一天,减一天,加减一小时一分钟,加减一年
2020/04/16 Python
Chicco婴儿用品美国官网:汽车座椅、婴儿推车、高脚椅等
2018/11/05 全球购物
我想声明一个指针并为它分配一些空间, 但却不行。这些代码有什么 问题?char *p; *p = malloc(10);
2016/10/06 面试题
2014年商场超市庆元旦活动方案
2014/02/14 职场文书
少先队学雷锋活动月总结
2014/03/09 职场文书
廉洁教育学习材料
2014/05/19 职场文书
经销商年会策划方案
2014/05/29 职场文书
离婚协议书格式
2014/11/21 职场文书
运动会100米加油稿
2015/07/21 职场文书
新教师2015年度工作总结
2015/07/22 职场文书
vue backtop组件的实现完整代码
2021/04/07 Vue.js
win10频率超出范围怎么办?win10老显示超出工作频率范围的解决方法
2022/07/07 数码科技
前端框架ECharts dataset对数据可视化的高级管理
2022/12/24 Javascript