Python程序間通訊之共享記憶體

2021-08-07 15:30:32 字數 1860 閱讀 8435

前一篇部落格說了怎樣通過命名管道實現程序間通訊,但是要在windows是使用命名管道,需要使用python調研windows api,太麻煩,於是想到是不是可以通過共享記憶體的方式來實現。查了一下,python中可以使用mmap模組來實現這一功能。

python中的mmap模組是通過對映同乙個普通檔案實現共享記憶體的。檔案被對映到程序位址空間後,程序可以像訪問記憶體一樣對檔案進行訪問。

不過,mmap在linux和windows上的api有些許的不一樣,具體細節可以檢視mmap的文件。

下面看乙個例子:

這個程式使用 test.dat 檔案來對映記憶體,並且分配了1024位元組的大小,每隔一秒更新一下記憶體資訊。

import mmap

import contextlib

import time

with open("test.dat", "w") as f:

f.write('\x00' * 1024)

with open('test.dat', 'r+') as f:

with contextlib.closing(mmap.mmap(f.fileno(), 1024, access=mmap.access_write)) as m:

for i in range(1, 10001):

m.seek(0)

s = "msg " + str(i)

s.rjust(1024, '\x00')

m.write(s)

m.flush()

time.sleep(1)

這個程式從上面對映的檔案 test.dat 中載入資料到記憶體中。

import mmap

import contextlib

import time

while

true:

with open('test.dat', 'r') as f:

with contextlib.closing(mmap.mmap(f.fileno(), 1024, access=mmap.access_read)) as m:

s = m.read(1024).replace('\x00', '')

print s

time.sleep(1)

上面的**可以在linux和windows上執行,因為我們明確指定了使用 test.dat 檔案來對映記憶體。如果我們只需要在windows上實現共享記憶體,可以不用指定使用的檔案,而是通過指定乙個tagname來標識,所以可以簡化上面的**。如下:

import mmap

import contextlib

import time

with contextlib.closing(mmap.mmap(-1, 1024, tagname='test', access=mmap.access_write)) as m:

for i in range(1, 10001):

m.seek(0)

m.write("msg " + str(i))

m.flush()

time.sleep(1)

import mmap

import contextlib

import time

while

true:

with contextlib.closing(mmap.mmap(-1, 1024, tagname='test', access=mmap.access_read)) as m:

s = m.read(1024).replace('\x00', '')

print s

time.sleep(1)

Linux高階程式設計基礎 程序間通訊之共享記憶體

建立共享記憶體,寫程序每隔2秒向記憶體寫入一次 hello world 如果結束寫操作,則寫程序寫入 end 讀程序從共享記憶體讀取資料,並列印。直到讀到 end 為止。這是寫程序 include include include include include include include inc...

Ubuntu下Linux程序間通訊 共享記憶體

linux提供了多種程序間通訊的方法,常見有管道 匿名 fifo 有名管道 訊息佇列 訊號量 共享記憶體,socket通訊。linux程序間通訊 匿名管道 linux程序間通訊 fifo 有名管道 linux程序間通訊 訊息佇列 linux程序間通訊 訊號量 linux程序間通訊 共享記憶體 5.共...

程序間通訊之共享記憶體

此程式實現兩個普通程序間通過共享記憶體來進行通訊,共享記憶體能夠進行大資料量的通訊,這一點事訊息佇列無法比擬的。在這裡同時使用了訊號量來保證兩個程序間的讀寫同步。傳送端源 include include include include include include include include ...