错误:
资源枯竭
我使用inotify监视目录中的任何文件更改。但问题是,文件进来的速度太快,耗尽了无用的资源。它打开了数千个文件句柄。当我收到通知时,是否有方法可以立即关闭文件句柄?例如,如果在给定的目录中创建了一个文件,我希望通知程序给出该文件的路径并关闭文件句柄,然后等待其他更改?

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个事件(或比您在注释中所说的还要多)。
假设您打开队列以接收请求….但你不能以一种让它空出来的速度读它。好吧,队列有一个上限,一旦到达,您就不能在队列中存储更多的东西…你得做点什么。你知道我想去哪里吗?

关于python - iNotify收到事件后如何关闭文件句柄,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52119326/

10-11 21:29