Pythonでマシン単位の多重起動を抑止する
多重起動抑止について調べている中で、Pythonで filelock と言うライブラリを知りました。簡単な例を試してみたので記録しておきます。tox-devで管理しているようです。
https://pypi.org/project/filelock
これは何
Pythonでファイルを使って多重起動を抑止するためのライブラリです。
「複数のプロセスが同じファイルやリソースを触る可能性があり、しかも同時に触られると壊れる」ときに使います。ファイルを使ったロックになるので、マシン単位でのロックになります。複数のマシンで動くようなWebアプリケーションサーバーなどでは別の方法が利用になります。
例
こんなふうに書きます。
from filelock import FileLock, Timeout
lock = FileLock("myapp.lock")
try:
lock.acquire(timeout=0)
except Timeout:
print("既に起動しています。終了します。")
raise SystemExit(1)
try:
# ここに本来の処理
main()
finally:
lock.release()
Code language: PHP (php)
こう動きます。uv で管理しているときの例です。
> uv run python main.py
1 秒経過
2 秒経過
3 秒経過
4 秒経過
5 秒経過
6 秒経過
7 秒経過
8 秒経過
9 秒経過
10 秒経過
ロック解除です
Code language: CSS (css)
実行中に別を呼び出すとこうなります。
> uv run python main.py
既に起動しています。終了します。
Code language: CSS (css)