2014年8月23日土曜日

Python でファイルロックで排他処理

Python でファイルロックを使い排他処理をする方法を調べたので、サンプルを作ってみました。

環境

  • Ubuntu 12.04.5 Server
  • Python 3.2.3

ロックを獲得できない場合はすぐに終了させる場合

#!/usr/bin/env python3

import fcntl
import io

def main():
    with open('LockFile') as oLockFile:
        try:
            fcntl.flock(oLockFile.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB)
        except IOError:
            print('ロックを獲得できませんでした')
            return
        
        try:
            print('ロックを獲得できました')
            print('ロックを獲得できた時の処理をここに書きます')
            print('例えば、ここでは 300秒間スリープします')
            import time
            time.sleep(300)
        finally:
            fcntl.flock(oLockFile.fileno(), fcntl.LOCK_UN)

if __name__ == '__main__':
    main()
  • ロックに使うファイル ‘LockFile’ を予め touch コマンド等で作成しておきます
  • fcntl.LOCK_NB を指定しているのでロックを獲得できない場合はすぐに IOError が送出されます

ロックを獲得できるまで (他のプロセスがロックを開放するまで) 待つ場合

#!/usr/bin/env python3

import fcntl
import io

def main():
    with open('LockFile') as oLockFile:
        print('ロックを獲得できるまで待ちます')
        fcntl.flock(oLockFile.fileno(), fcntl.LOCK_EX)
        
        try:
            print('ロックを獲得できました')
            print('ロックを獲得できた時の処理をここに書きます')
            print('例えば、ここでは 300秒間スリープします')
            import time
            time.sleep(300)
        finally:
            fcntl.flock(oLockFile.fileno(), fcntl.LOCK_UN)

if __name__ == '__main__':
    main()
  • ロックに使うファイル ‘LockFile’ を予め touch コマンド等で作成しておきます
  • fcntl.LOCK_NB を指定していないのでロックを獲得できるまで待ちます

0 件のコメント:

コメントを投稿