前一篇博客说了怎样通过命名管道实现进程间通信,但是要在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进程间通信之共享内存相关推荐

  1. python多进程共享内存_python 进程间通信 共享内存

    python多进程通信实例分析 python多进程通信实例分析操作系统会为每一个创建的进程分配一个独立的地址空间,不同进程的地址空间是完全隔离的,因此如果不加其他的措施,他们完全感觉不到彼此的存在.那 ...

  2. linux java 共享内存_Linux进程间通信之共享内存

    一,共享内存 内核管理一片物理内存,允许不同的进程同时映射,多个进程可以映射同一块内存,被多个进程同时映射的物理内存,即共享内存. 映射物理内存叫挂接,用完以后解除映射叫脱接. 1,共享内存的特点: ...

  3. python 进程间同步_python之路29 -- 多进程与进程同步(进程锁、信号量、事件)与进程间的通讯(队列和管道、生产者与消费者模型)与进程池...

    所谓异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了.至于被依赖的任务最终是否真正完成,依赖它的任务无法确定,所以它是不可靠 ...

  4. python进程和线程_Python进程与线程知识

    好程序员Python 培训分享进程与线程知识 , Python 开发语言现在已经是被大家非常看中的编程语言了,本篇文章给读者们分享一下 Python 进程与线程知识小结,本篇文章具有一定的参考借鉴价值 ...

  5. python进程与线程_Python进程与线程知识

    Python培训分享进程与线程知识,Python开发语言现在已经是被大家非常看中的编程语言了,本篇文章给读者们分享一下Python进程与线程知识小结,本篇文章具有一定的参考借鉴价值,感兴趣的小伙伴来了 ...

  6. python进程socket通信_python实现多进程通信实例分析

    操作系统会为每一个创建的进程分配一个独立的地址空间,不同进程的地址空间是完全隔离的,因此如果不加其他的措施,他们完全感觉不到彼此的存在.那么进程之间怎么进行通信?他们之间的关联是怎样的?实现原理是什么 ...

  7. python进程管理讲解_python之supervisor进程管理工具

    [unix_http_server] file=/tmp/supervisor.sock ; socket文件的路径,supervisorctl用XML_RPC和supervisord通信就是通过它进 ...

  8. python进程socket通信_python3 进程间通信之socket.socketpair()

    python3 进程间通信之socket.socketpair() socket.socketpair()是什么鬼东西? socket.socketpair()函数仅返回两个已经连接的套接字对象,参数 ...

  9. python进程数上限_python如何控制进程或者线程的个数

    背景 日常开发中,难免遇到并发场景,而并发场景难免需要做流量控制,即需要对并发的进程或者线程的总量进行控制. 今天简单总结两种常用的控制线程个数的方法. 方法一:进程池/线程池 如下例demo所示, ...

最新文章

  1. Python基础总结(1)
  2. linux中的keeplived源码装,Keepalived高可用集群搭建
  3. Deeplab unexpected label
  4. Nginx 快速安装手册及如何修改端口号
  5. poj 1035 Spell checker(hash)
  6. Java实践(五)——类的声明与引用
  7. 根据CTP接口计算现手、增仓、开平、对手盘 (2)
  8. 七夕祝福网页制作_七夕福利 | 程序员土味情话大PK,专属好礼等你拿
  9. php私有云盘,教你搭建个人/企业私有云盘-kodexplorer
  10. abaqus各种文件说明
  11. 架构师的5大基本能力
  12. MVC5 + EF6 + Bootstrap3 (9) HtmlHelper用法大全(下)
  13. 【转载】html转义字符
  14. matlab 与cla的区别clf,何时使用cla(),clf()或close()清除matplotlib中的图?...
  15. 小程序导出数据到excel表,借助云开发后台实现excel数据的保存
  16. android9默认字体下载,iFont爱字体 v5.5.9 Android特别版-实用的手机换字体软件
  17. Visual Studio 2005键盘锁定
  18. 服务器通过笔记本共享网络
  19. 2021-06-03:布尔运算。给定一个布尔表达式和一个期望的布尔结果 result,布尔表达式由 0 (false)、1 (true)、 (AND)、 | (OR) 和 ^ (XOR) 符号组成。
  20. uos打包——appimage包转uos的deb包

热门文章

  1. 数学基础、机器学习经典算法、统计学习方法,这份机器学习在线手册来帮你...
  2. WE CAN:全球智能路由网络 | 体验共享技术专题
  3. 使用高级视频质量工具 AVQT 评估视频 | WWDC 演讲实录
  4. 网络应用优化——时延与带宽
  5. Maven引入外部jar的几种方法
  6. Django 02 url路由配置及渲染方式
  7. 【Android Studio安装部署系列】十八、Android studio更换APP应用图标
  8. ASP.NET MVC XML绑定Action参数列表
  9. 科普:TLS、SSL、HTTPS以及证书(转)
  10. config中自定义配置