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中使用Flask、MongoDB搭建简易图片服务器
Feb 04 Python
简单介绍Ruby中的CGI编程
Apr 10 Python
利用python生成一个导出数据库的bat脚本文件的方法
Dec 30 Python
Python递归实现汉诺塔算法示例
Mar 19 Python
Django实现分页功能
Jul 02 Python
如何用Python破解wifi密码过程详解
Jul 12 Python
Python3并发写文件与Python对比
Nov 20 Python
python实现字符串和数字拼接
Mar 02 Python
Python爬虫程序架构和运行流程原理解析
Mar 09 Python
python爬虫如何解决图片验证码
Feb 14 Python
python 实现定时任务的四种方式
Apr 01 Python
golang特有程序结构入门教程
Jun 02 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
Zend 输出产生XML解析错误
2009/03/03 PHP
一步一步学习PHP(5) 类和对象
2010/02/16 PHP
PHP实现服务器状态监控的方法
2014/12/09 PHP
php猜单词游戏
2015/09/29 PHP
php 获取文件行数的方法总结
2016/10/11 PHP
tp5框架使用composer实现日志记录功能示例
2019/01/10 PHP
一款JavaScript压缩工具:X2JSCompactor
2007/06/13 Javascript
js跨域问题之跨域iframe自适应大小实现代码
2010/07/17 Javascript
Javascript的严格模式strict mode详细介绍
2014/06/06 Javascript
js实现Form栏显示全格式时间时钟效果代码
2015/08/19 Javascript
jQuery实现的可编辑表格完整实例
2016/06/20 Javascript
Ajax使用原生态JS验证用户名是否存在
2020/05/26 Javascript
Javascript循环删除数组中元素的几种方法示例
2017/05/18 Javascript
详解vue+css3做交互特效的方法
2017/11/20 Javascript
Vue 开发音乐播放器之歌手页右侧快速入口功能
2018/08/08 Javascript
angular2/ionic2 实现搜索结果中的搜索关键字高亮的示例
2018/08/17 Javascript
python发送HTTP请求的方法小结
2015/07/08 Python
Python 3中的yield from语法详解
2017/01/18 Python
Python实现感知机(PLA)算法
2017/12/20 Python
Python用于学习重要算法的模块pygorithm实例浅析
2018/08/16 Python
Python中staticmethod和classmethod的作用与区别
2018/10/11 Python
Python图像处理之直线和曲线的拟合与绘制【curve_fit()应用】
2018/12/26 Python
python+selenium实现自动化百度搜索关键词
2019/06/03 Python
python程序 线程队列queue使用方法解析
2019/09/23 Python
解决Python二维数组赋值问题
2019/11/28 Python
在Ubuntu 20.04中安装Pycharm 2020.1的图文教程
2020/04/30 Python
python获取天气接口给指定微信好友发天气预报
2020/12/28 Python
英国花园药房: The Garden Pharmacy
2017/12/28 全球购物
Nike德国官网:Nike.com (DE)
2018/11/13 全球购物
俄罗斯一家时尚女装商店:Charuel
2019/12/04 全球购物
支部鉴定材料
2014/06/02 职场文书
大学辅导员述职报告
2015/01/10 职场文书
英语辞职信范文
2015/02/28 职场文书
python 用递归实现通用爬虫解析器
2021/04/16 Python
MySQL查看表和清空表的常用命令总结
2021/05/26 MySQL
使用logback实现按自己的需求打印日志到自定义的文件里
2021/08/30 Java/Android