专栏首页未闻Code一日一技:不用轮询,基于事件监控文件变动

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

摄影:产品经理

跟产品经理去喝酒

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

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

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

首先使用 pip 安装它:

python3 -m pip install inotify

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

然后写一段代码:

from inotify.adapters import Inotify
import 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]

asyncinotify 的用法与 inotify 几乎一样,可以参考asyncinotify 的官方文档[2]

参考资料

[1]

inotify 的 Github: https://github.com/dsoprea/PyInotify

[2]

asyncinotify 的官方文档: https://asyncinotify.readthedocs.io/en/latest/

本文分享自微信公众号 - 未闻Code(itskingname),作者:kingname

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-08-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 一日一技:超级简单搭建更加稳定安全的文件分享服务器

    在公众号以前的文章里面,我们提到,如果想简单的分享一下文件,我们可以使用一行 Python 命令:

    青南
  • 如何使用 Python批量读取多个文件

    可以看出,它会自动把你输入的内容打印出来,相当于在 whileTrue里面加上了 input。

    青南
  • 记住Python变量类型的三种方式

    Python作为一门动态语言,其变量的类型可以自由变化。这个特性提高了代码的开发效率,却也增加了阅读代码和维护代码的难度。

    青南
  • 17款最好用的跨浏览器测试工具

    市面上有很多不同的浏览器,每种浏览器都有数百万用户。因此,在构建一个网站或 Web 应用程序时,就需要测试它与不同浏览器的兼容性。最好、最方便的方法是使用跨浏览...

    深度学习与Python
  • Java工具集-数学(立方体操作工具类)

    cwl_java
  • 使用Logistic回归实现猫的二分类

    这里使用到的是一个猫的数据集,根据这个数据集训练图像是不是猫,数据集的图像如下:

    夜雨飘零
  • TypeScript

    lib用于指定要包含在编译中的库文件 “lib”:[ “es6”, “dom” ],

    jinghong
  • 除Innodb和MyISAM外MySQL还有哪些存储引擎

    CSV存储引擎可以将CSV文件作为mysql表来处理,存储格式就是普通的CSV文件。如果把数据存储在myisam和Innodb中,存储数据的文件是不能直接查看的...

    端碗吹水
  • MySQL命令操作(Linux平台)

    alter table gametop800 add primary key(id);

    阳光岛主
  • Python的双端队列deque

    Python的强大并不在于它的语法,而在于它的库,当你对各种数据结构感到苦恼时,Python提供了各种开箱即用的数据结构。

    疯狂软件李刚

扫码关注云+社区

领取腾讯云代金券