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

时间:2018-08-31 16:14:38

标签: python linux inotify

错误:

  

尾声使资源耗尽

我正在使用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 :(得分:0)

嗯。...我对您问题的评论以及对他们的回答感到困惑。

当内核打开文件时,它会检查inotify队列以为其生成记录并将其排入队列。这样做的过程就是发出open(2)系统调用的过程,因此对我来说很奇怪,您很高兴每秒打开100个以上的文件,而内核却在某个地方丢失了信息。您遇到的问题(很可能是,但我可能是错的)是inotify处理器没有时间获取如此大量的打开事件,并且队列已满。

您在这里有两种方法。第一个涉及扩展inotify队列以支持更多资源。我不知道inotify队列是否具有允许您执行此操作的运行时配置(无论如何,您都可以转到内核源代码并进行调整)。第二个可能涉及inotify中的 bad design 处理器...如果您的处理器一次处理一个inotify记录,并且假设您必须打开一个到远程站点的tcp连接来记录此类事件,那么您就很麻烦了。由于您没有显示任何代码,这些代码可能会导致inotify读取器变慢,因此我无法为您提供某种解决方案的方法,但问题就在于此了:inotify接收器未参加处理100个事件/的队列。第二(或超过您在评论中所说的)

假设您打开一个队列来接收请求...。但是您随后没有以允许其清空的速度读取它。好吧,队列有一个上限,一旦达到上限,您就无法在队列中存储更多的东西。你看到我要去哪里了吗?