pythonで簡単にプロセス間の排他制御がしたかったのでロックファイルによる実装を行いました。
尚、確認している環境は以下です。
- mac(OS X El Capitan バージョン 10.11.5)
- pip利用可能
- python 2.7.9
利用するもの
- zc.lockfile
指定した名称のロックファイルを作成し、排他制御をしてくれるライブラリ。
pidで管理されるので、ロックしたプロセスが終了した場合、closeしなくても排他状態が解放されるので例外が出ても扱いやすい。と思います。
以下で、いつものようにインストール
$ pip install zc.lockfile
利用例
特に意味はないですが、デコレータで実装。
ロック中の処理をちゃんとしたい場合(ログを出力するとか、待機するとか)には使えないです。
なにはともあれ排他制御したい人向け。
lock.py
# -*- coding: utf-8 -*-
import sys
from zc import lockfile
from zc.lockfile import LockError
def lock_or_through(func):
'''ロックファイルによる排他制御デコレータ
ロックされている場合は処理自体をスルー
'''
def lock(*args, **kwargs):
lock = None
try:
lock = lockfile.LockFile('lock')
except LockError:
print("locked")
return
func(*args, **kwargs)
# 対象のpidが有効でなければロックされないので例外が出ても実質問題無し
lock.close()
return lock
@lock_or_through
def main(sys_argv):
"""ロックファイルで排他制御したい処理"""
print('process you need')
if __name__ == '__main__':
main(sys.argv)