lisz-works

プログラミングと興味を貴方に

Python3 ロックファイルで排他処理をする方法

【スポンサーリンク】

Python

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(ロック解除)

参考

コチラを参考にしました。ありがとうございました。

docs.python.org

manpages.debian.org

www.phactory.jp

www.phactory.jp

nfnoface.hatenablog.com

あとがき

Python3でロックファイルで排他処理をする方法でした!

C言語同様、かなり簡単に排他処理ができました。

排他が必要になったら試してみてください!