Сторожевой таймер Python и работа с потоками в порядке очереди

У меня есть сценарий Python, который отслеживает, создаются ли новые файлы в данном каталоге X, если новые файлы появляются, сценарий вызывает другой модуль для обновления текстового файла. Новые файлы в каталоге X создаются с 1 удаленного компьютера, и может случиться так, что несколько файлов будут созданы одновременно.

Сценарий выглядит примерно так: когда удаленный компьютер создает один файл время от времени, он работает хорошо, но я думаю, что у меня могут возникнуть проблемы, если другой компьютер создаст несколько файлов за очень короткое время. И несколько экземпляров "Alarm" откроют неверную версию "shared_file.txt". Как я могу установить поток в очередь, чтобы работать в порядке очереди? И разрешить только один за раз?

app.py

from watchdog.observers import Observer
from watchdog.events import PatternMatchingEventHandler
import threading
from MyModule.Alarm import main as Alarm

class AlarmHandler(PatternMatchingEventHandler):
    patterns = ["*alarm*"]
    def process_alm(self, event):
        alarm_thread = threading.Thread(target=Alarm, args=(event.src_path,))
        alarm_thread.start()
        return

    def on_created(self, event):
        self.process_alm(event)

def main():
    event_handler = AlarmHandler()
    observer = Observer()
    observer.schedule(event_handler, path='/path/to/spool/new', recursive=False)
    observer.daemon=True
    observer.start()
    try:
        while True:
            sleep(1)
    except:
        observer.unschedule_all()
        observer.stop()
        scheduler.shutdown()
    observer.join()

if __name__ == '__main__':
    main()

MyModule / Alarm.py

def main( wd_file ):
    with open( wd_file, 'r') as f:
        # Create python vars with wd_file
    with open("shared_file.txt", 'r') as f:
        # Create python vars with shared_file.txt
    # Calculations using shared_file.txt and wd_file
    # Call a server (response may take 1-2s)
    with open("shared_file.txt", "w") as f:
        f.write( something_calculated_above )

0 ответов

Другие вопросы по тегам