Python多进程(2)——mmap模块与mmap对象

  本文介绍Python mmap模块与mmap对象的用法。python

  mmap 模块提供“内存映射的文件对象”,mmap 对象能够用在使用 plain string 的地方,mmap 对象和 plain string 的区别是:windows

  • mmap 对象不提供字符串对象的方法;
  • mmap 对象是可变的,而 str 对象是不可变的
  • mmap 对象同时对应于打开的文件,多态于一个Python file 对象

  mmap 对象能够切片和索引,也能够为它的切片或索引赋值(由于 mmap 对象是可变的),为 mmap 对象的切片赋值时,赋值语句右值的长度必须和左值切片的长度相同。mmap 对象能够做为进程间经过文件进行 IPC 的一种替换手段。spa

 

建立 mmap 对象指针

mmap(filedesc, length, tagname='') #windows
mmap(filedesc, length, flag=MAP_SHARED, prot=PROT_READ|PROT_WRITE) #Unix

  建立并返回一个 mmap 对象,参数 filedesc 一般是由 f.fileno()得到的,这在Python文件系列中已经介绍过。code

  mmap 建立对象的含义是:将指定 fd 的前 length 字节映射到内存。对象

  Windows中,能够经过参数tagname为一段内存映射指定名称,这样一个文件上面能够同时具备多个 mmap。windows中的内存映射都是可读可写的,同时在进程之间共享。blog

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

相关文章
相关标签/搜索