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 件のコメント:
コメントを投稿