1. 程式人生 > >Python多程序(2)——mmap模組與mmap物件

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

相關推薦

Python程序2——mmap模組mmap物件

  本文介紹Python mmap模組與mmap物件的用法。   mmap 模組提供“記憶體對映的檔案物件”,mmap 物件可以用在使用 plain string 的地方,mmap 物件和 plain string 的區別是: mmap 物件不提供字串物件的方法; mmap 物件是可變的,而 str

python進階2——re模組:正則表示式1

實驗結果輸出文件,包括多項引數(大約幾百個),想把所有的loss value對應的值提取出來,畫出曲線圖,這就需要用到正則表示式,基於此,開始學習正則表示式。 正則表示式:可匹配文字片段的模式 萬用字元:句點.(.ython與jpython與python與 ython都匹配,但不與ython

python進階2——re模組:正則表示式2

re.split 根據模式來分割字串 import re text='a, b,,,,c d' print(re.split('[, ]+', text)) #re.split:以空格和字串分割字元 re.findall 返回列表,包含所有與給定模式匹配的子串 import re

Python程序multiprocessing學習總結

    RawArray(typecode_or_type, size_or_initializer)         Returns a shared array返回一個共享佇列      RawValue(typecode_or_type, *args)         Returns a shared

Python程序1——subprocessPopen()

  Python多程序方面涉及的模組主要包括: multiprocessing:提供支援多處理器技術的多程序程式設計介面,並且介面的設計最大程度地保持了和threading模組的一致,便於理解和使用。   本文主要介紹 subprocess 模組及其提供的 Popen 類,以及如何使用該構造器

Python程序multiprocessing

目錄 簡介 多程序相對於多執行緒可以更好的使用多核,避開GIL(Global Interpreter Lock)的影響。而且多程序引入了程序池的概念,可以更好的並行處理不同輸入的資料。 Process 類 在多程序中,通過建立Process

python高階——程序2資料夾拷貝器

import os import multiprocessing def copy_file(q, file_name, old_folder_name, new_folder_name): """完成檔案複製""" old_f = open(old_folder_name +

第一個python程序2

小結 nts 技術 數學公式 spa 但是 漂亮 num 回車 輸入和輸出 輸出 用print加上字符串,就可以向屏幕上輸出指定的文字。比如輸出‘hello, world‘,用代碼實現如下: >>> print ‘hello, world‘ print語

初學python的一些簡單程序2

eric not in mov AS int pen != 必須 light 1)判斷兩個列表內容相同的元素 l1=[11,22,33] l2=[22,33,44] for i in l1: if i in l2: print(i) 2)獲取l1

Python2.執行緒(建立執行緒的兩種方式)

Python中threading模組 可以總結出:    (1)當呼叫Thread的時候,不會建立執行緒 (2)呼叫Thread創建出來的例項物件的start方法的時候,才會建立執行緒以及讓這個執行緒開始執行      

Python 執行緒、程序 執行緒、同步、通訊

Python 多執行緒、多程序 (一)之 原始碼執行流程、GIL Python 多執行緒、多程序 (二)之 多執行緒、同步、通訊 Python 多執行緒、多程序 (三)之 執行緒程序對比、多執行緒 一、python多執行緒 對於I/O操作的時候,程序與執行緒的效能差別不大,甚至由於執行緒更輕量級,效能更高

Python 執行緒、程序 之 原始碼執行流程、GIL

Python 多執行緒、多程序 (一)之 原始碼執行流程、GIL Python 多執行緒、多程序 (二)之 多執行緒、同步、通訊 Python 多執行緒、多程序 (三)之 執行緒程序對比、多執行緒 一、python程式的執行原理 許多時候,在執行一個python檔案的時候,會發現在同一目錄下會出現一個__

Python 執行緒、程序 之 執行緒程序對比、程序

Python 多執行緒、多程序 (一)之 原始碼執行流程、GIL Python 多執行緒、多程序 (二)之 多執行緒、同步、通訊 Python 多執行緒、多程序 (三)之 執行緒程序對比、多執行緒 一、多執行緒與多程序的對比 在之前簡單的提過,CPython中的GIL使得同一時刻只能有一個執行緒執行,即併

python程序multiprocessing

python中多程序(multiprocessing) 一、multiprocessing中使用子程序概念 from multiprocessing import Process 可以通過Process來構造一個子程序 p = Process(target=fun,args=(arg

Python 執行緒、程序 執行緒、同步、通訊

一、python多執行緒 對於I/O操作的時候,程序與執行緒的效能差別不大,甚至由於執行緒更輕量級,效能更高。這裡的I/O包括網路I/O和檔案I/O 1、例項 假如利用socket傳送http請求,也就是網路I/O。爬取列表網頁中的寫href連結,然後獲取href連結之後,在爬去連結的網頁詳情。 如果不適用

Python程序的使用 Python執行緒threading程序multiprocessing 示例程式碼 Python程序程式設計

程序:程式的一次執行(程式載入記憶體,系統分配資源執行)。每個程序有自己的記憶體空間,資料棧等,程序之間可以進行通訊,但是不能共享資訊。 執行緒:所有的執行緒執行在同一個程序中,共享相同的執行環境。每個獨立的執行緒有一個程式入口,順序執行序列和程式的出口。 執行緒的執行可以被強佔,中斷或者暫時被

python中的Queue程序multiprocessing

最近接觸一個專案,要在多個虛擬機器中執行任務,參考別人之前專案的程式碼,採用了多程序來處理,於是上網查了查python中的多程序 一、先說說Queue(佇列物件) Queue是python中的標準庫,可以直接import 引用,之前學習的時候有聽過著名的“先吃先拉”與“後吃

【nodejs原理&原始碼賞析4】深度剖析cluster模組原始碼node.js程序

目錄 一. 概述 二. 執行緒與程序 三. cluster模組原始碼解析 3.1 起步 3.2 入口 3.3 主程序模組master.js 3.4 子程序模組c

【nodejs原理&原始碼賞析6】深度剖析cluster模組原始碼node.js程序

目錄 一. 引言 二.server.listen方法 三.cluster._getServer( )方法 四.跨程序通訊工具方法Utils 五.act:queryServer訊息

python執行緒和程序

在進入主題之前,我們先學習一下併發和並行的概念: --併發:在作業系統中,併發是指一個時間段中有幾個程式都處於啟動到執行完畢之間,且這幾個程式都是在同一個處理機上執行。但任一時刻點上只有一個程式在處理機上執行。形象的點描述:一個人做很多事情,但同一時刻只能做一件事情。 --並行:當系統有一個CPU時,則程式的