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

例:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM