iNotify收到事件后如何关闭文件句柄

问题描述 投票:1回答:1

呃:

尾巴使资源耗尽

我正在使用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
python linux inotify
1个回答
0
投票

嗯....我对你的问题的评论和对它们的回答感到有些困惑。

当内核打开文件时,它会检查inotify队列以生成并为其排队记录。执行该操作的过程是发出open(2)系统调用的过程,因此对我来说很奇怪,您可以高兴地打开超过100个文件/秒,并且内核在某处丢失信息。你遇到的问题(最有可能,但我可能是错的)是inotify处理器没有时间来获得如此大量的开放事件并且队列已满。

你有两种方法。第一个涉及扩展inotify队列以便能够支持更多资源。我不知道inotify队列是否有一些运行时配置允许你这样做(无论如何你可以去内核源并调整它)第二个可能涉及inotify处理器中的糟糕设计...如果你的处理器进程inotify一次记录一个,让我们假设你必须打开一个到远程站点的TCP连接,记录这些事件,然后你就麻烦了。由于您没有显示任何可能会减慢inotify阅读器速度的代码,因此我无法为您提供解决问题的方法,但问题在于:inotify接收器不会参加队列来处理100个事件/第二(或者比你在评论中说的更多)

假设您打开一个队列来接收请求....但是您不会以允许它为空的速度读取它。好吧,队列有一个上限,一旦到达你就无法在队列中存储更多东西....你必须做点什么。你知道我想去哪里吗?

© www.soinside.com 2019 - 2024. All rights reserved.