4

一度に1つのインスタンスのみを実行することになっているThread-extendingクラスがあります(クロスプロセス)。それを実現するために、私はファイルロックを使おうとしています。これが私のコードの一部です:

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場合、呼び出しが例外をスローすることを期待していました。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スレッドが同時に実行されており、例外がスローされていないことを示しています。ここでは本当に基本的なものが欠けていると思いますが、それが何であるか理解できないようです。誰か助けてもらえますか?

4

3 に答える 3

3

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

于 2011-03-20T17:48:08.403 に答える
2

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

wまたはを使用するr+a

于 2011-03-20T17:00:11.767 に答える
0

flockを使用することに加えて、私は次のようにファイルも開かなければなりませんでした:

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

それ以外の方法では機能しません。

于 2013-08-26T10:14:31.390 に答える