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

ошибка:

истощены ресурсы хвоста

Я использую 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

1 Ответ

0 голосов
/ 03 сентября 2018

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

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

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

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

...