本质:
将文件映射到内存,进行直接对内存进行读写(当关闭mmap时内存映射才写入到文件,中间的操作都是在内存)
优点:
1.直接读写内存,不需要任何数据拷贝。管道消息队列需要在内核和用户空间进行四次数据拷贝,而共享内存只拷贝两次数据(一次是文件到共享内存,一次是从共享内存到输出文件上)
缺点:

Windows: mmap(fileno, length[, tagname[, access[, offset]]])
Unix: mmap(fileno, length[, flags[, prot[, access[, offset]]]])

参数 描述
fileno 文件描述符file对象的fileno()方法
length 映射的长度,0表示全部映射
flags
prot
access ACCESS_READ:读访问;ACCESS_WRITE:写访问,默认;ACCESS_COPY:拷贝访问,不会把更改写入到文件,使用flush把更改写到文件
方法 描述
close() 关闭映射
m.find(str, start=0) 从start开始,从左到右寻找str,返回下标
m.flush([offset, n]) 从offset开始的n个字节刷到对应的文件中,开启ACCESS_COPY时使用
move(dstoff, srcoff, n) 从 srcoff 开始的 n 个字节复制到从 dstoff 开始的n个字节
read(n) m 对应的文件中最多读取 n 个字节,当前位置后移动
read_byte()
readline()
seek(pos, how=0) 改变当前位置
size() 文件的长度
tell() 返回当前位置
write(str)
write_byte(byte)

1.基本使用


import mmap#1.先创建一个文件
with open('hello.txt', 'wb') as f:f.write(b"Hello Python!\n")
#2.将文件与文件进行映射
with open('hello.txt', 'r+b') as f:mm = mmap.mmap(f.fileno(), 0) # f.fileno()文件描述符,size为0表示读取整个文件print(mm.readline())  # prints "Hello Python!" # 标准读取方式print(mm[:5])  # prints "Hello"# 切片读取方式mm[6:] = b" world!\n"mm.seek(0)# 使用seek定位光标到数据头,当前光标已到数据末(mm.tell()可获取当前光标)print(mm.readline())  # prints "Hello  world!"# 再次标准读取mm.close()# 像处理文件一样关闭mmap映射

2.父子进程通信

import mmap
import os
import timemm = mmap.mmap(-1, 27)#传入文件描述符-1,使用匿名映射
mm.write(b"Original msg") # 涉及mm的读写都要记得字符串的二进制
print('write successfully')pid = os.fork()if pid == 0:  # 子进程中mm.seek(0)print('Read from the mmap:')print(mm.readline())#以切片访问时,严格按照字符串长度mm[12:] =  b' sth from child'mm.close()
else:time.sleep(2)# 用sleep使子进程先执行mm.seek(0)print('Read from the child:')print(mm.readline())mm.close()

3.无关进程linux的通信

import mmap
import contextlib
import timewith open("mmap.file", "w") as f:f.write('\x00' * 1024)with open('mmap.file', 'r+') as f:m = mmap.mmap(f.fileno(), 1024, access=mmap.ACCESS_WRITE)for i in range(1, 10001):m.seek(0)m.write(b"hello")m.flush()time.sleep(1)
import mmap
import contextlib
import timewhile True:with open('mmap.file', 'r') as f:with contextlib.closing(mmap.mmap(f.fileno(), 1024, access=mmap.ACCESS_READ)) as m:s = m.read().replace(b'\x00',b'')print(s)time.sleep(1)

4.无关进程win通信

server.py

import mmap
import contextlib
import timewith 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 timewhile True:with contextlib.closing(mmap.mmap(-1, 1024, tagname='test', access=mmap.ACCESS_READ)) as m:s = m.read(1024).replace('\x00', '')print stime.sleep(1)

参考:
https://www.xuebuyuan.com/3189076.html
https://docs.python.org/zh-cn/3.9/library/mmap.html
https://blog.csdn.net/zdy0_2004/article/details/53200250
https://blog.csdn.net/m0_37422289/article/details/79895526
https://blog.csdn.net/m0_37422289/article/details/79895526

python mmap相关推荐

  1. python mmap对象

    ----使用内存映射的原因 为了随机访问文件的内容,使用mmap将文件映射到内存中是一个高效和优雅的方法.例如,无需打开一个文件并执行大量的seek(),read(),write()调用,只需要简单的 ...

  2. python slice是共享内存吗_python共享内存实现进程通信

    1.概述 共享内存可以说是最有用的进程间通信方式.两个不同的进程共享内存的意思是:同一块物理内存被映射到两个进程的各自的进程地址空间.一个进程可以及时看到另一个进程对共享内存的更新,反之亦然.采用共享 ...

  3. python 系统编程

    进程 进程|Process|Pool|Event|os.fork|zombies|getpid 共享数据|Lock|Semaphore|线程安全对象 subprocess|os.system|os.e ...

  4. Android C++ Native 内存泄露检查工具Raphael使用介绍

    Android C++ Native 内存泄露检查工具使用介绍 实现原理 使用方法 Raphael添加到测试apk 添加项目依赖 同步gradle 启动泄露检测功能 直接使用boardcast功能控制 ...

  5. python mmap_python mmap对象

    ----使用内存映射的原因 为了随机访问文件的内容,使用mmap将文件映射到内存中是一个高效和优雅的方法.例如,无需打开一个文件并执行大量的seek(),read(),write()调用,只需要简单的 ...

  6. Python将文件映射到内存使用mmap.mmap()函数

    1.如何将文件映射到内存 实际案例: (1)在访问某些二进制文件时,希望能把文件映射到内存中,可以实现随机访问.(framebuffer设备文件) (2)某些嵌入式设备,寄存器被编址到内存地址空间,我 ...

  7. python字符串类库_Python 常用类库

    python除了关键字(keywords)和内置的类型和函数(builtins),更多的功能是通过libraries(即modules)来提供的. 常用的libraries(modules)如下: 1 ...

  8. Python并发编程实例教程

    有关Python中的并发编程实例,主要是对Threading模块的应用,文中自定义了一个Threading类库. 一.简介 我们将一个正在运行的程序称为进程.每个进程都有它自己的系统状态,包含内存状态 ...

  9. Python标准库介绍

    1. 关于Python标准库 众所周知,Python是一个依赖强大的组件库完成对应功能的语言,为了便捷实现各项功能,前辈大牛们打造了多种多样的工具库公开提供给大众使用,而越来越多的库已经因为使用的广泛 ...

最新文章

  1. 在线作图|2分钟在线绘制RDA图
  2. mysql 游标 ,嵌套游标
  3. LINUX下文件字符集编码查看与转换并文件名编码转换
  4. Python实现遍历目录与子目录,并找到以.txt结尾的文件
  5. 计算机二级语义网络的研究现状与展望,计算机二级access选择题题库研究.doc
  6. 操作系统磁盘调度_磁盘调度| 操作系统
  7. linux 下查看程序依赖的库
  8. 第十四节: EF的三种模式(四) 之 原生正宗的 CodeFirst模式的默认约定
  9. 凉了!张三同学没答好「进程间通信」,被面试官挂了....
  10. 工作3、5年,选择大厂还是小厂?
  11. 腾讯研发总监王辉:十亿级视频播放技术优化揭秘
  12. unity ab包加载_Unity资源管理和打包
  13. 电脑重启 硬件问题引发的人品问题
  14. 计算机专业课系列之四:漫谈操作系统之虚拟内存
  15. MyEclipse的html页面 design视图中 关闭可视化界面
  16. 中国IP网通IP地址段
  17. VS2010的项目配置属性中文对照
  18. 获取字符串中 图片路径
  19. Ubuntu中安装VirtualBox
  20. 基于单片机的超市储物柜设计_基于51单片机的超市自动储物柜的设计,求大佬指点?...

热门文章

  1. Python使用正则表达式检查合法IP地址
  2. 微课|玩转Python轻松过二级:第1章课后习题解答
  3. 【C++】之【运算符重载函数】
  4. 关于流(文件)的输入,输出与调用(fprintf,fscanf)
  5. 35岁学python爬虫_35岁码农的机器学习入门之路-python篇
  6. 关于二叉树路径的遍历和处理
  7. android 保存图片出现2张_OriCell第三届细胞培养图片大赛来啦~ - 实验动物
  8. flowable 多人签收_业务流程 BPM、工作流引擎、Flowable、Activiti
  9. flink source 同步_Flink面试题
  10. mysql xa 实现_MySQL数据库分布式事务XA的实现原理分析