本文介绍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() 什么都不做。

例:

# 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秒检查一下文件是否发生变化。

Python多进程(2)——mmap模块与mmap对象的更多相关文章

  1. python 多进程处理 multiprocessing模块

    前提: 有时候一个用一个进程处理一个列表中的每个元素(每个元素要传递到一个函数中进行处理),这个时候就要用多进程处理 1 现场案例: 我有一个[ip1,ip2,ip3,.......]这样的列表,我要 ...

  2. python标准库介绍——19 mmap 模块详解

    ==mmap 模块== (2.0 新增) ``mmap`` 模块提供了操作系统内存映射函数的接口, 如 [Example 2-13 #eg-2-13] 所示. 映射区域的行为和字符串对象类似, 但数据 ...

  3. Python中使用operator模块实现对象的多级排序

    Python中使用operator模块实现对象的多级排序 今天碰到一个小的排序问题,需要按嵌套对象的多个属性来排序,于是发现了Python里的operator模块和sorted函数组合可以实现这个功能 ...

  4. Python 中 logging 日志模块在多进程环境下的使用

    因为我的个人网站 restran.net 已经启用,博客园的内容已经不再更新.请访问我的个人网站获取这篇文章的最新内容,Python 中 logging 日志模块在多进程环境下的使用 使用 Pytho ...

  5. python中日志logging模块的性能及多进程详解

    python中日志logging模块的性能及多进程详解 使用Python来写后台任务时,时常需要使用输出日志来记录程序运行的状态,并在发生错误时将错误的详细信息保存下来,以别调试和分析.Python的 ...

  6. python中datetime模块中datetime对象的使用方法

    本文只讲述datetime模块中datetime对象的一些常用的方法,如果读者需要更多datetime模块的信息,请查阅此文档. datetime模块的对象有如下: timedelta date da ...

  7. Python多进程(1)——subprocess与Popen()

    Python多进程方面涉及的模块主要包括: subprocess:可以在当前程序中执行其他程序或命令: mmap:提供一种基于内存的进程间通信机制: multiprocessing:提供支持多处理器技 ...

  8. python基础31[常用模块介绍]

    python基础31[常用模块介绍]   python除了关键字(keywords)和内置的类型和函数(builtins),更多的功能是通过libraries(即modules)来提供的. 常用的li ...

  9. Python多进程使用

    [Python之旅]第六篇(六):Python多进程使用   香飘叶子 2016-05-10 10:57:50 浏览190 评论0 python 多进程 多进程通信 摘要:   关于进程与线程的对比, ...

随机推荐

  1. 可能是史上最强大的js图表库——ECharts带你入门

    PS:之前的那篇博客Highcharts——让你的网页上图表画的飞起 ,评论中,花儿笑弯了腰 和 StanZhai 两位仁兄让我试试 ECharts ,去主页看到<Why ECharts ?&g ...

  2. input 禁止输入法

    <INPUT TYPE = text STYLE = "ime-mode:disabled" > 即可禁止输入法 js形式: active 代表输入法为中文inacti ...

  3. VS2012的调试插件Image Watch,opencv编程神器

    今天配置 opencv3.0 时无意中看到 Image Watch 这样一个VS2012的调试插件,适用了下,特别好用. 部分链接: Image Watch 的 下载链接 OpenCV关于ImageW ...

  4. 覆盖问题:最大覆盖问题(Maximum Covering Location Problem,MCLP)和集覆盖问题(Location Set Covering Problem,LSCP)

    集覆盖问题研究满足覆盖所有需求点顾客的前提下,服务站总的建站个数或建 设费用最小的问题.集覆盖问题最早是由 Roth和 Toregas等提出的,用于解决消防中心和救护车等的应急服务设施的选址问题,他们 ...

  5. zabbix告警使用sendEmail

    1sendmail介绍 详细介绍见官网:http://caspian.dotconf.net/menu/Software/SendEmail/ 2使用sendEmail sendEmail是个十分优秀 ...

  6. python select 实现

    python的select()方法直接调用操作系统的IO接口 它监控sockets,openfiile,pipes (所有带fileno()的方法的文件句柄) 什么时候变成 readable writ ...

  7. ubuntu中 不同JDK版本之间的切换

    Ubuntu中JDK 的切换前提是同时安装了多个版本,如jdk7和jdk8,若要切换,在终端输入: sudo update-alternatives --config java sudo update ...

  8. CSS3-transform 转换/变换

    transform 向元素应用 2D 或 3D 转换.该属性允许我们对元素进行旋转.缩放.移动或倾斜. 兼容性: Internet Explorer 10.Firefox.Opera 支持 trans ...

  9. 使用腾讯开发平台获取QQ用户数据资料

    <今天是七夕:祝大家七夕嗨皮,前可么么哒,后可啪啪啪> Tips:本篇博客将教你如何使用腾讯开发平台获取QQ用户资料 ----------------------------------- ...

  10. 修改Firefox的User-Agent,伪装修改秘籍

    火狐浏览器修改userAgent的办法一: 在火狐浏览器地址栏输入"about:config",按下回车进入设置菜单. 找到"general.useragent.over ...