Мое приложение Flask регистрирует запросы в отдельных файлах json, потому что они довольно большие и просто загромождают обычные текстовые журналы (например, app.logger.info("..")
).Он хранит последние n запросов в некоторой папке.
Точнее, функция отбрасывает все файлы json, и, если их больше n , она удаляет по одному за раз изатем добавляет новый запрос:
logfiles = sorted(glob.glob("*.json"))
while len(logfiles) >= n:
os.remove(logfiles.pop(0))
Я использую приложение с сервером gunicorn и заметил, что для идентичного запроса оно иногда дает сбой, а иногда и успешно.За сбоем следует информация:
[18935] [INFO] Handling signal: int
[18935] [INFO] Shutting down: Master
Я предполагаю, что два рабочих-оружейника одновременно получают доступ к папке журнала и пытаются удалить один и тот же файл.Таким образом, один из двух завершится сбоем, потому что файл уже ушел.Я знаю (= слышал о) этот тип проблемы при программировании с несколькими потоками, но мне до сих пор никогда не приходилось решать ее самостоятельно.
Я предполагаю, что мне придется заблокировать папку и создать очередь изработники, которые пытаются добавить / удалить файлы в папку?Какой лучший способ пойти по этому поводу?Должен ли я использовать один из доступных модулей, таких как threading
или Queue
?Будут ли они работать гладко с Flask и gunicorn?Или я должен реализовать свою собственную очередь?
PS: Это дополнительный вопрос к Как регистрировать большие запросы в виде файлов?