У меня есть Thread
-расширяющий класс, который должен запускать только один экземпляр за раз (кросс-процесс). Чтобы добиться этого, я пытаюсь использовать блокировку файлов. Вот биты моего кода:
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
Что означает, что два потока Scanner
работают одновременно, без исключений. Я уверен, что мне не хватает чего-то действительно базового здесь, но я не могу понять, что это такое. Кто-нибудь может помочь?