Pythonでflockという関数を使った、ロックファイルによる排他処理をする方法です!
事前準備
はじめにロックファイルを作っておかないといけません。
今回は「/home/<user-name>/work/test/」に、「.lock」というファイルを作って使うことします。
$ cd ~/work/test $ touch .lock
作ったもの
こんなものを作ってみました。
import sys import fcntl import os import time # /tmp/shm とかにすればtmpにファイルおける lockfilePath = '/home/<user-name>/work/test/.lock' def lock(): # ロック lockfile = open(lockfilePath, "r") fcntl.flock(lockfile.fileno(), fcntl.LOCK_EX) print('lock') return lockfile def unlock(lockfile): # アンロック fcntl.flock(lockfile.fileno(), fcntl.LOCK_UN) lockfile.close() print('unlock') if __name__ == "__main__": lockfile = lock() print('何らかの処理(10秒)') time.sleep(10) unlock(lockfile)
実行すると?
コンパイルをしたら、ターミナルを2つ実行しておきます(T1,T2とする)。
T1で実行してロックがされた後に、T2で実行してみましょう。
T2はすぐには処理(出力)がされず、T1がアンロックしたタイミングで動き出します。
ロックに関する関数の解説
各処理について見ていきます。
ロックファイルを開く
ロックファイルをオープンします。
C言語のロック★前記事★でいうところの、fdの取得にあたるところですね。
lockfile = open(lockfilePath, "r")
C言語とはことなり、読込モードでOKです。
ロック
ファイルのロックは、fcntl.flock()を使用します。
fcntl.flock(lockfile.fileno(), fcntl.LOCK_EX)
引数は
引数 | 内容 |
---|---|
第1引数 | 開いたロックファイルのfileno |
第2引数 | fcntl.LOCK_EX(排他ロック) |
LOCK_EXは、「排他ロックしてね!」を指示します。
アンロック
ファイルのアンロックも、fcntl.flock()を使用します。
fcntl.flock(lockfile.fileno(), fcntl.LOCK_UN)
引数は
引数 | 内容 |
---|---|
第1引数 | 開いたロックファイルのfileno |
第2引数 | fcntl.LOCK_UN(ロック解除) |
参考
コチラを参考にしました。ありがとうございました。
あとがき
Python3でロックファイルで排他処理をする方法でした!
C言語同様、かなり簡単に排他処理ができました。
排他が必要になったら試してみてください!