Сторожевой таймер Python: дождитесь завершения вывода файла из разных программ в отслеживаемый каталог перед дальнейшей обработкой.

У меня есть несколько докеризированных приложений, которые выводят данные в общий каталог, и докеризированный сторожевой скрипт Python, который следит за этим каталогом и должен обрабатывать данные дальше после завершения вывода программы.

Крайне важно, чтобы файл был завершен до его дальнейшей обработки. Я попытался реализовать решение, подобное Окна сторожевого таймера Python ждут завершения копирования :

def on_modified(event):
    sizeBefore = -1
    while os.path.getsize(event.src_path) != sizeBefore:
        sizeBefore = os.path.getsize(event.src_path)
        time.sleep(1)
    print(f"[+] File transfer of {event.src_path} completed")

который работает нормально для отдельных файлов, но ломается, когда ему нужно отслеживать несколько файлов. Ожидание завершения вывода программы, а затем копирование файла в отслеживаемую папку также не вариант, поскольку я имею дело с потенциально большими файлами, копирование которых займет не менее нескольких секунд, а затем у меня возникает та же проблема.

Любые идеи о том, как я могу настроить обработчик событий on_modified, чтобы он правильно смотрел, пока файл больше не будет изменен, работая с несколькими файлами в одном каталоге.


person mvk1980    schedule 31.08.2020    source источник
comment
Можете ли вы заставить свои приложения создавать временные файлы, то есть файлы с определенным шаблоном, например "*.tmp", чтобы ваш сторожевой скрипт знал, что они находятся в процессе создания и могут быть проигнорированы. Как только временный файл будет полностью создан, ваши приложения могут переименовать его в свое окончательное имя, и ваш сторожевой таймер сможет взять на себя управление.   -  person quamrana    schedule 31.08.2020
comment
Чтобы добавить к этому: в этом случае вы можете заставить сторожевой таймер реагировать только на on_renamed события.   -  person MrBean Bremen    schedule 31.08.2020
comment
@MrBeanBremen: Можете дать ссылку на это мероприятие?   -  person quamrana    schedule 31.08.2020
comment
Ах, извините, вспомнил, что ошибся - это on_moved, а не on_renamed.   -  person MrBean Bremen    schedule 31.08.2020
comment
Спасибо за вклад! Я пытался не менять приложения докера, но похоже, что это путь вперед.   -  person mvk1980    schedule 31.08.2020