ERR:
хвост изотифицирует исчерпанные ресурсы
Я использую Inotify для просмотра каталога для любых изменений файла. Но проблема в том, что файлы идут быстро, что истощает ресурсы Inotifier. Он открывает тысячи дескрипторов файлов. Есть ли способ, с помощью которого, когда я получаю уведомление, я могу сразу закрыть дескриптор файла? Например, если файл создается в данном каталоге, я хочу, чтобы уведомитель дал мне путь к этому файлу и закроет дескриптор файла и дождитесь других изменений?
import inotify.adapters
import os
from config import DOCKER_PATH_TO_STREAMS
notifier = inotify.adapters.Inotify()
for files in os.listdir(DOCKER_PATH_TO_STREAMS):
notifier.add_watch(os.path.join(DOCKER_PATH_TO_STREAMS,files))
def watch_for_files():
for event in notifier.event_gen():
if event is not None:
if 'IN_CREATE' in event[1]:
val = os.path.join(event[2],event[3])
if val.endswith(".jpeg") or val.endswith(".jpg"):
return val
Хм... Я немного смущен комментариями к вашему вопросу и ответами на них.
Когда ядро открывает файл, он проверяет очереди inotify для генерации и очереди записи для него. Процесс, который делает это тот, который выдает open(2)
системный вызов, поэтому для меня странно, что вы можете быть рады открыть более 100 файлов в секунду, а ядро потеряет информацию где-то. Проблема, с которой вы сталкиваетесь (скорее всего, но я ошибаюсь) заключается в том, что процессор inotify не успевает получить такое количество событий открытия и очередь заполняется.
У вас есть два подхода. Первый включает расширение очереди inotify для поддержки большего количества ресурсов. Я не знаю, имеет ли очередь inotify некоторую конфигурацию времени выполнения, которая позволяет вам это делать (в любом случае вы можете перейти к источнику ядра и настроить на это). Второй, вероятно, включает плохой дизайн в процессоре inotify... если ваш процессор обрабатывает inotify записи по одному, и пусть предположим, что вам нужно открыть tcp-соединение с удаленным сайтом, чтобы регистрировать такие события, тогда у вас есть явные проблемы. Поскольку вы не показываете код, который указывает на то, что может замедлить чтение inotify, я не могу дать вам некоторые средства для решения проблемы, но проблема в том, что приемник inotify не посещает очередь для обработки 100 событий/второй (или больше, чем вы говорите в комментариях)
Предположим, вы открываете очередь для получения запросов.... но вы тогда не читаете ее темпами, которые позволяют ей пустить. Ну, очередь имеет верхний предел, и как только вы достигли, вы не можете хранить больше вещей в очереди... вам нужно что-то сделать. Вы видите, куда я хочу пойти?