Как закрыть дескрипторы файлов после того, как iNotify получает событие

1

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
  • 0
    Что такое «Inotifier»? Это сторонний инструмент, библиотека или какой-то код, который вы написали?
  • 0
    Inotify * Inotify (inode notify) - это подсистема ядра Linux, которая расширяет файловые системы, чтобы замечать изменения в файловой системе и сообщать об этих изменениях приложениям.
Показать ещё 6 комментариев
Теги:
inotify

1 ответ

0

Хм... Я немного смущен комментариями к вашему вопросу и ответами на них.

Когда ядро открывает файл, он проверяет очереди inotify для генерации и очереди записи для него. Процесс, который делает это тот, который выдает open(2) системный вызов, поэтому для меня странно, что вы можете быть рады открыть более 100 файлов в секунду, а ядро потеряет информацию где-то. Проблема, с которой вы сталкиваетесь (скорее всего, но я ошибаюсь) заключается в том, что процессор inotify не успевает получить такое количество событий открытия и очередь заполняется.

У вас есть два подхода. Первый включает расширение очереди inotify для поддержки большего количества ресурсов. Я не знаю, имеет ли очередь inotify некоторую конфигурацию времени выполнения, которая позволяет вам это делать (в любом случае вы можете перейти к источнику ядра и настроить на это). Второй, вероятно, включает плохой дизайн в процессоре inotify... если ваш процессор обрабатывает inotify записи по одному, и пусть предположим, что вам нужно открыть tcp-соединение с удаленным сайтом, чтобы регистрировать такие события, тогда у вас есть явные проблемы. Поскольку вы не показываете код, который указывает на то, что может замедлить чтение inotify, я не могу дать вам некоторые средства для решения проблемы, но проблема в том, что приемник inotify не посещает очередь для обработки 100 событий/второй (или больше, чем вы говорите в комментариях)

Предположим, вы открываете очередь для получения запросов.... но вы тогда не читаете ее темпами, которые позволяют ей пустить. Ну, очередь имеет верхний предел, и как только вы достигли, вы не можете хранить больше вещей в очереди... вам нужно что-то сделать. Вы видите, куда я хочу пойти?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню