File Lock ne fonctionne pas comme prévu
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?
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.