Python進程間通信之共享內存

前一篇博客說了怎樣通過命名管道實現(xiàn)進程間通信,但是要在windows是使用命名管道,需要使用python調研windows api,太麻煩,于是想到是不是可以通過共享內存的方式來實現(xiàn)。查了一下,Python中可以使用mmap模塊來實現(xiàn)這一功能。

Python中的mmap模塊是通過映射同一個普通文件實現(xiàn)共享內存的。文件被映射到進程地址空間后,進程可以像訪問內存一樣對文件進行訪問。

不過,mmap在linux和windows上的API有些許的不一樣,具體細節(jié)可以查看mmap的文檔。

下面看一個例子:

server.py

這個程序使用 test.dat 文件來映射內存,并且分配了1024字節(jié)的大小,每隔一秒更新一下內存信息。

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)

client.py

這個程序從上面映射的文件 test.dat 中加載數(shù)據(jù)到內存中。

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上實現(xiàn)共享內存,可以不用指定使用的文件,而是通過指定一個tagname來標識,所以可以簡化上面的代碼。如下:

server.py

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)

client.py

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)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Linux進程通信實現(xiàn)機制有很多,也有各自優(yōu)缺點和適用場景,關于她們之間的對比,等各種通信機制一一介紹后,再來一個...
    batbattle閱讀 4,211評論 3 13
  • 一.管道機制(pipe) 1.Linux的fork操作 在計算機領域中,尤其是Unix及類Unix系統(tǒng)操作系統(tǒng)中,...
    Geeks_Liu閱讀 3,808評論 1 9
  • 必備的理論基礎 1.操作系統(tǒng)作用: 隱藏丑陋復雜的硬件接口,提供良好的抽象接口。 管理調度進程,并將多個進程對硬件...
    drfung閱讀 3,756評論 0 5
  • 操作系統(tǒng)的主要任務是管理計算機的軟件、硬件資源?,F(xiàn)代操作系統(tǒng)的主要特點是多用戶和多任務,也就是程序的并行執(zhí)行,wi...
    杰倫哎呦哎呦閱讀 2,714評論 0 14
  • border-image的屬性
    陸lmj閱讀 290評論 0 0

友情鏈接更多精彩內容