Help us understand the problem. What is going on with this article?

Pythonでプロセス間の排他ファイルアクセス

More than 3 years have passed since last update.

Pythonでプロセス間の排他ファイル制御をするための方法を調べたのでメモ。
lockfileというものがあるが、そのドキュメントに

This package is deprecated. It is highly preferred that instead of
using this code base that instead fasteners or oslo.concurrency is
used instead.

とあるのでfastenersを使ってみる。
PyPIにあるのでpipで簡単にインストールできる:

pip install fasteners

documentExamplesのうち、今回はinterprocess lockを使ってみる。
withを使う方法とデコレータにする方法がある。

import os
import time
import fasteners

def main():
    pid = os.getpid()
    while True:
        print("Waiting...")
        with fasteners.InterProcessLock('/tmp/tmp_lock_file'):
            print('Locked by {}'.format(pid))
            time.sleep(2)
        time.sleep(1)

if __name__ == '__main__':
    main()

withの中の部分が排他的に実行される。

import os
import time
import fasteners

@fasteners.interprocess_locked("/tmp/tmp_lock_file")
def action_with_lock():
    pid = os.getpid()
    print("{} has a lock".format(pid))
    time.sleep(1)

if __name__ == '__main__':
    action_with_lock()

一つの関数を排他的に実行したい場合はこっち。
いずれも簡単に実装できる。
予め/tmp/tmp_lock_fileを作っておく必要も無いし便利。

ricos
FEMによる構造解析、機械学習の専門家集団。計算資源のクラウド提供もしています。
https://www.ricos.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away