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秒檢查一下文件是否發生變化。

相關文章
相關標籤/搜索