7
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-04-08

#1 目的

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

#2 内容

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

54.JPG

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

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

55.JPG

56.JPG

#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
7
11
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?