質問

私は持っています Thread- 一度に1つのインスタンスのみを実行することになっている拡張クラス(クロスプロセス)。それを達成するために、私はファイルロックを使用しようとしています。これが私のコードのビットです:

class Scanner(Thread):

  def __init__(self, path):
    Thread.__init__(self)
    self.lock_file = open(os.path.join(config.BASEDIR, "scanner.lock"), 'r+')
    fcntl.lockf(self.lock_file, fcntl.LOCK_EX | fcntl.LOCK_NB)

  # Stuff omitted

  def run(self):
    logging.info("Starting scan on %s" % self.path)

    # More stuff omitted

    fcntl.lockf(self.lock_file, fcntl.LOCK_UN)

私は期待していました lockf aの場合、例外をスローするための呼び出し Scanner スレッドはすでに実行されていて、オブジェクトをまったく初期化しませんでした。ただし、ターミナルでこれを見ることができます。

INFO:root:Starting scan on /home/felix/Music
INFO:root:Starting scan on /home/felix/Music
INFO:root:Scan finished
INFO:root:Scan finished

これは2つを示唆しています Scanner スレッドは同時に実行されていますが、例外はありません。ここでは本当に基本的なものが足りないと確信していますが、それが何であるかを理解できないようです。誰かが助けることができますか?

役に立ちましたか?

解決

最終的に自分で解決策を見つけました。使用することでした fcntl.flock() それ以外の fcntl.lockf(), 、まったく同じパラメーターで。なぜそれが違いをもたらしたのかわからない。

他のヒント

使用してロックファイルを開いています r+ 以前のファイルを消去し、新しいファイルを作成しています。各スレッドは別のファイルをロックしています。

使用する w また r+a

Flockを使用することに加えて、次のようなファイルも開く必要がありました。

fd = os.open(lockfile, os.O_CREAT | os.O_TRUNC | os.O_WRONLY)

それは賢明ではありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top