Pythonでの共有メモリの実現方法(mmap.mmap)


1 目的

Pythonコードを実施中に、コード内部の変数を外部からアクセスすることで変更したい。

2 内容

Pythonコードを実行中に変数aを外部からアクセスし変更したい。下記のように、常にテキストファイル「TEST.txt」の内容を変数aに格納するコード(test1.py)を考える。ここでtest1.pyを実行中にTEST.txtの中身を変更したとしても、test1.py中の変数aの値は更新されない。(変更前のTEST.txtの値のままになってしまう)

3 どのようにすればいいか

TEST.txtの内容をメモリに読み出す。test1.pyとtest2.pyはメモリを共有する。test1.pyは変数aにメモリの値を読み出している。test2.pyはメモリの値を変更する。test1.pyを実行すると常にメモリから値を読み取り変数aに格納する。test2.pyを実行すると、メモリの値が変更され、test1.pyはtest2.pyで更新された値を読み出す。

4 コード

上記の動作を実現するコードを下記に載せます。
mmap.mmapを使います -> 読み込んだファイルの内容をメモリに格納することができます。

先にtest1.pyを動作させたあとにtest2.pyを駆動してください。

/test1.py

import mmap
with open("example.txt", "r+b") as f:
       #mmap.mmap(fileno, length[, tagname[, access[, offset]]])  指定されたファイルから length バイトをマップする。 
       #length が 0 の場合、マップの最大の長さは現在のファイルサイズになります。
    mm = mmap.mmap(f.fileno(), 0) #ファイルの内容を読み出しmmに書き込む。mmはbitの列"01010101..." //mmap.mmap(fileno, length[, tagname[, access[, offset]]])
    while True:
        mm.seek(0) #メモリmmを頭から読み出し(seek(0))、読み出した値をmmに格納する。
        mode=mm.readline() #メモリmmの内容を変数modeに書き出す。
        print(mode)
/test2.py
import mmap

with open("example.txt", "r+b") as f:
#ファイルの内容を読み出しmmに書き込む。mmはbitの列"01010101..."
    mm = mmap.mmap(f.fileno(), 0)  
#メモリmmをb"01"に書き換える。example.txtのデータの長さが2なので書き込むデータの長さも2で指定する。example.txtのデータと違う長さのデータは書き込みできません。
    mm[:] = b"01"  

/example.txt
#データは2進数表記してください。メモリに書き込むため
00