Question

I ont une classe de Thread-extension qui est censé exécuter une seule instance à la fois (inter-processus). Pour y parvenir, je suis en train d'utiliser un verrou de fichier. Voici les morceaux de mon code:

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)

Je me attendais à l'appel lockf à jeter une exception si un fil de Scanner était déjà en cours d'exécution et d'initialiser l'objet du tout. Cependant, je peux voir dans le terminal:

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

Ce qui suggère que deux fils de Scanner sont en cours d'exécution en même temps, pas d'exception levée. Je suis sûr que je manque quelque chose ici vraiment basique, mais je ne peux pas sembler comprendre ce qui est. Quelqu'un peut-il aider?

Était-ce utile?

La solution

trouvé la solution moi-même à la fin. Il était d'utiliser fcntl.flock() au lieu de fcntl.lockf(), avec les mêmes paramètres exacts. Je ne sais pas pourquoi cela a fait une différence.

Autres conseils

Vous ouvrez le fichier de verrouillage à l'aide r+ qui efface le fichier précédent et la création d'un nouveau. Chaque thread verrouille un fichier différent.

Utilisez w ou r+a

Avec l'aide de troupeau, je devais aussi ouvrir le fichier comme ceci:

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

Il ne fonctionne pas autrement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top