一日一技:不用轮询,基于事件监控文件变动

简介: 一日一技:不用轮询,基于事件监控文件变动

摄影:产品经理跟产品经理去喝酒

我们经常会遇到监控文件变化的需求。例如日志监控程序监控日志文件,一旦日志文件发生变化,就进行读取。或者是大批量爬虫的规则配置文件监控,爬虫本身持续运行,一旦规则文件发生修改就自动读取新的规则。

常见的做法,如果文件比较小,可以直接读取以后跟上次读取的内容做对比;也可以判断文件的修改时间是否发生变化;也可以判断文件的 md5值是否发生变化。

但不论哪种方案,都需要不停轮询检查文件。那有没有不轮询的方案呢?如果你的操作系统是 Linux,那么你可以使用 inotify 或者 asyncinotify。其中前者代码是同步模式,后者基于 asyncio 实现异步模式。他们都会在文件发生变动的时候,主动通过一个事件通知你,从而避免轮询。我们以 inotify 为例。

首先使用 pip 安装它:


python3 -m pip install inotify

然后,我们在当前目录创建一个文件:test.txt,一开始这个文件为空。

然后写一段代码:


from inotify.adapters import Inotifyimport inotify.constants as Mask
inotify = Inotify()
inotify.add_watch('test.txt', mask=Mask.IN_MODIFY)for event in inotify.event_gen(yield_nones=False):    print(event)

运行效果如下图所示:

我们也可以同时监控多个文件:


inotify.add_watch('test.txt', mask=Mask.IN_MODIFY)inotify.add_watch('test2.txt', mask=Mask.IN_MODIFY)inotify.add_watch('test3.txt', mask=Mask.IN_MODIFY)

运行效果如下图所示:

除了监控文件修改,我们还可以监控文件被访问、打开、关闭、移动事件事件,他们分别对应:

  • 文件被访问:Mask.IN_ACCESS
  • 文件被修改:Mask.IN_MODIFY
  • 文件被打开:Mask.IN_OPEN
  • 文件被关闭并有写入:Mask.IN_CLOSE_WRITE
  • 文件被关闭但是无写入:Mask.IN_CLOSE_NOWRITE
  • 文件被删除:Mask.IN_DELETE
  • 这些变化,我们可以通过|竖线来同时使用,例如:

inotify.add_watch('test.txt', mask=Mask.IN_MODIFY | Mask.IN_OPEN)  # 文件被打开或者被修改,就发出事件

运行效果如下图所示:

可以看到,因为要修改或者读取文件的时候,必定会打开文件,所以当我们直接使用cat test1.txt的时候,依然会看到IN_OPEN这个事件发生。

如果想进一步了解inotify,可以访问inotify 的 Github[1]

目录
相关文章
|
4月前
|
存储 缓存 前端开发
如何实现设备组缓存的正确清除?——基于心跳请求和心跳响应的解决方案
如何实现设备组缓存的正确清除?——基于心跳请求和心跳响应的解决方案
34 0
|
10月前
|
监控 小程序 API
叮咚抢菜-派送时段监听及推送工具🔧
叮咚抢菜-派送时段监听及推送工具🔧
96 0
|
Web App开发 JavaScript 前端开发
页面运行中事件频繁触发会阻塞页面吗?
之前看`防抖`和`节流`的时候,看到短时间内大量的事件触发会引起浏览器卡死,浪费浏览器性能,那么为什么事件触发会引起阻塞页面的情况呢?引起页面阻塞的原因真的是因为事件触发太多了吗?
|
测试技术
自动定时发送每日构建测试报告
自动定时发送每日构建测试报告
130 1
|
监控 数据库
zabbix告警持续频繁发送历史消息解决方法
zabbix持续频繁的发送历史的告警消息,一晚上告警内容高达1.7w条,严重影响查看真正出现问题的告警信息。 产生此问题的原因: 告警消息积压堆积,一直处于重试状态。 触发器的确存在,但是目标监控主机的状态是正常的,只要触发器触发的问题存在,那么就会一直发生告警。
968 0
|
监控
【新功能发布】定时暂停应用分组报警规则的通知发送
云监控的应用分组,旨在帮助用户按照业务维护管理监控报警。这次推出的报警规则定时暂停功能,可以在您的业务执行变更、升级,造成指标符合预期的波动时,定时关闭报警,不发送报警通知。
1460 0
|
数据采集 监控 微服务
服务监控信息到底是“主动推送”还是“被动扫描”???
服务监控信息到底是“主动推送”还是“被动扫描”???
1533 0
|
监控 Oracle 关系型数据库