Python多进程(2)——mmap模块与mmap对象
本文介绍Python mmap模块与mmap对象的用法。
mmap 模块提供“内存映射的文件对象”,mmap 对象可以用在使用 plain string 的地方,mmap 对象和 plain string 的区别是:
- mmap 对象不提供字符串对象的方法;
- mmap 对象是可变的,而 str 对象是不可变的
- mmap 对象同时对应于打开的文件,多态于一个Python file 对象
mmap 对象可以切片和索引,也可以为它的切片或索引赋值(因为 mmap 对象是可变的),为 mmap 对象的切片赋值时,赋值语句右值的长度必须和左值切片的长度相同。mmap 对象可以作为进程间通过文件进行 IPC 的一种替换手段。
创建 mmap 对象
mmap(filedesc, length, tagname='') #windows mmap(filedesc, length, flag=MAP_SHARED, prot=PROT_READ|PROT_WRITE) #Unix
创建并返回一个 mmap 对象,参数 filedesc 通常是由 f.fileno()获得的,这在Python文件系列中已经介绍过。
mmap 创建对象的含义是:将指定 fd 的前 length 字节映射到内存。
Windows中,可以通过参数tagname为一段内存映射指定名称,这样一个文件上面可以同时具有多个 mmap。windows中的内存映射都是可读可写的,同时在进程之间共享。
Unix平台上,参数 flags 的可选值包括:
mmap.MAP_PRIVATE:这段内存映射只有本进程可用;
mmap.MAP_SHARED:将内存映射和其他进程共享,所有映射了同一文件的进程,都能够看到其中一个所做的更改;
参数 prot 对应的取值包括:mmap.PROT_READ, mmap.PROT_WRITE 和 mmap.PROT_WRITE | mmap.PROT_READ。最后一者的含义是同时可读可写。
mmap 对象的方法
m.close() 关闭 m 对应的文件;
m.find(str, start=0) 从 start 下标开始,在 m 中从左往右寻找子串 str 最早出现的下标;
m.flush([offset, n]) 把 m 中从offset开始的n个字节刷到对应的文件中,参数 offset 要么同时指定,要么同时不指定;
m.move(dstoff, srcoff, n) 等于 m[dstoff:dstoff+n] = m[srcoff:srcoff+n],把从 srcoff 开始的 n 个字节复制到从 dstoff 开始的n个字节,可能会覆盖重叠的部分。
m.read(n) 返回一个字符串,从 m 对应的文件中最多读取 n 个字节,将会把 m 对应文件的位置指针向后移动;
m.read_byte() 返回一个1字节长的字符串,从 m 对应的文件中读1个字节,要是已经到了EOF还调用 read_byte(),则抛出异常 ValueError;
m.readline() 返回一个字符串,从 m 对应文件的当前位置到下一个'\n',当调用 readline() 时文件位于 EOF,则返回空字符串;
m.resize(n) 把 m 的长度改为 n,m 的长度和 m 对应文件的长度是独立的;
m.seek(pos, how=0) 同 file 对象的 seek 操作,改变 m 对应的文件的当前位置;
m.size() 返回 m 对应文件的长度(不是 m 对象的长度len(m));
m.tell() 返回 m 对应文件的当前位置;
m.write(str) 把 str 写到 m 对应文件的当前位置,如果从 m 对应文件的当前位置到 m 结尾剩余的空间不足len(str),则抛出 ValueError;
m.write_byte(byte) 把1个字节(对应一个字符)写到 m 对应文件的当前位置,实际上 m.write_byte(ch) 等于 m.write(ch)。如果 m 对应文件的当前位置在 m 的结尾,也就是 m 对应文件的当前位置到 m 结尾剩余的空间不足1个字节,write() 抛出异常ValueError,而 write_byte() 什么都不做。
对于EOF的处理,write() 和 read_byte() 抛出异常 ValueError,而 write_byte() 和 read() 什么都不做。
例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | # process 1 f = open ( 'xxx' , 'w' ) while True : data = raw_input ( 'Enter some text:' ) f.seek( 0 ) f.write(data) f.truncate() f.flush() # process 2 import mmap, os, time m = mmap.mmap(os. open ( 'xxx' , os.O_RDWR), 1 ) last = None while True : m.resize(m.size()) data = [:] if data ! = last: print data last = data time.sleep( 5 ) |
该例子中,process 1 等待用户输入新内容并将其写入到文件 xxx 中,process 2 直接将整个文件映射到内存对象 m,然后每隔5秒检查一下文件是否发生变化。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人