###前提・実現したいこと
RaspberryPi3(Raspbian Jessie)でpython3.4.2でプログラムを書いています。
実現したいことは、
・あるプロセスが設定ファイルを読み込んでいるときは、他プロセスは設定ファイルに書き込みできないようにしたい
・あるプロセスが設定ファイルに書き込んでいるときは他プロセスは設定ファイルを読み書きできないようにしたい
の2点です。
(いわゆるREADロックとWRITEロックを実現したい)
###試したこと
hoge.txtに"hoge"という文字を一行書き込むwrite.py
hoge.txtを読み込むread.py
をとりあえず作成しました。コードは次のとおりです。
- write.py
python
1#/usr/bin/python3 2# -*- coding:utf-8 -*- 3import fcntl 4import time 5 6while 1: 7 f = open("/var/tmp/hoge.txt", "w") #ここから 8 try: 9 fcntl.flock(f, fcntl.LOCK_EX) #ここまでの間で読み込みが行われると、空白を読み込む 10 f.write("hoge\r\n") 11 fcntl.flock(f, fcntl.LOCK_UN) 12 except IOError: 13 pass 14 finally: 15 f.close()
- read.py
python
1#/usr/bin/python3 2# -*- coding:utf-8 -*- 3import fcntl 4 5while 1: 6 f = open("/var/tmp/hoge.txt", "r") 7 try: 8 fcntl.flock(f, fcntl.LOCK_SH) 9 str = f.read().replace("\r","").replace("\n","") 10 f1 = open("/var/tmp/read.history", "a") 11 f1.write("{}\r\n".format(str)) 12 f1.close() 13 fcntl.flock(f, fcntl.LOCK_UN) 14 except IOError: 15 pass 16 finally: 17 f.close()
このwrite.pyとread.pyを同時に走らせました。
sh
1$ python3 write.py & 2$ python3 read.py &
###発生している問題
read.historyというファイルにread.pyがhoge.txtを読み込んだ履歴を出力しているのですが、ファイルを見てみると次のようになりました。
- read.history
hoge (略。空白行が続く) hoge hoge (略。空白行が続く)
何回か空白を読み込んでしまっているようです。
どうやら、write.pyがファイルを開いてから、ロックをかけるまでのわずかな時間の間に読み込みが発生すると、空白を読み込んでしまうようです。
「write.pyが書き込んでいる間はread.pyは読み込まない」という風にするには、どうすればよいでしょうか?
また、「ファイルを開くと同時にロックする」という方法は可能ですか?

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/02/16 01:11
2017/02/16 01:17
2017/02/16 01:39
2017/02/16 02:03