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)

類似投稿