V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
black11black
V2EX  ›  Python

Python 有什么办法异步监控文件修改吗?

  •  
  •   black11black · 2020-08-12 12:18:17 +08:00 · 3821 次点击
    这是一个创建于 1593 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题,需求是想要用 websocket 实时监控日志文件。

    一个很简单的实现方法是间隔一定时间轮询是否有修改,比如每秒查看一次日志是否有改动,但是毕竟这么写还是不太舒服

    最理想的方式是当文件修改以后触发一个回调。

    以前用过同步的库实现这个功能,忘了叫什么了,想问一下异步现在有实现方案吗,毕竟基本上所有东西都是异步的了

    21 条回复    2020-09-02 14:10:48 +08:00
    zmxnv123
        1
    zmxnv123  
       2020-08-12 12:22:36 +08:00 via iPhone
    用 shell 吧 我记得有个工具可以监控文件事件
    BingoXuan
        2
    BingoXuan  
       2020-08-12 12:24:28 +08:00
    leimao
        3
    leimao  
       2020-08-12 12:24:59 +08:00
    用 asyncio?
    lvqier
        4
    lvqier  
       2020-08-12 12:38:47 +08:00
    inotify 应该可以实现你的需求
    black11black
        5
    black11black  
    OP
       2020-08-12 12:39:51 +08:00
    @BingoXuan 以前用的是这个,这个是同步的。以前有时间的时候封装过异步,代码找不到了,最近忙懒得封装
    MoYi123
        6
    MoYi123  
       2020-08-12 12:41:48 +08:00
    同步的库是 select,用 asyncio 应该能改成异步的。
    NoAnyLove
        7
    NoAnyLove  
       2020-08-12 12:49:34 +08:00
    abersheeran
        8
    abersheeran  
       2020-08-12 13:54:05 +08:00
    @NoAnyLove watchgod 这玩意就是轮询遍历。还是 https://pypi.org/project/watchdog/ 更适合。

    @black11black 纠正一下,watchdog 是基于多线程的回调设计。你完全可以把它用在异步代码里,并不会阻塞主线程。
    zhuangzhuang1988
        9
    zhuangzhuang1988  
       2020-08-12 13:54:18 +08:00
    37Y37
        11
    37Y37  
       2020-08-12 14:36:46 +08:00   ❤️ 1
    一毛一样的需求,这里有个现成的,django channels websocket
    https://blog.ops-coffee.cn/s/r5spytjrl0jjeauye4q_-q
    Tink
        12
    Tink  
       2020-08-12 15:03:45 +08:00
    inotify
    zyuu2
        13
    zyuu2  
       2020-08-12 17:04:09 +08:00
    watchdog +1
    AlohaV2
        14
    AlohaV2  
       2020-08-12 17:26:51 +08:00
    lolizeppelin
        15
    lolizeppelin  
       2020-08-12 17:51:23 +08:00
    https://github.com/coreutils/coreutils/blob/master/src/tail.c

    linux 标准工具就是最好的学习对象
    hushao
        16
    hushao  
       2020-08-12 20:08:05 +08:00
    15 楼说的对,linux 的话 tail 就可以了
    yucongo
        17
    yucongo  
       2020-08-13 23:30:35 +08:00 via Android   ❤️ 1
    watchgod https://pypi.org/project/watchgod/ (注意后面是 g o d )支持异步
    black11black
        18
    black11black  
    OP
       2020-08-14 17:16:47 +08:00
    @hushao windows

    @yucongo 感谢,项目不错
    neoblackcap
        19
    neoblackcap  
       2020-08-30 05:48:33 +08:00
    @MoYi123 asyncio 底层用 epoll,不会支持文件的,其他楼说得挺好的,用基于 inotify 的库就好了。当然了,FreeBSD 可以用 kqueue,不过得自己写
    black11black
        20
    black11black  
    OP
       2020-09-02 12:22:57 +08:00
    @neoblackcap epoll 为啥不支持文件读写,epoll 不是基于文件描述符么
    neoblackcap
        21
    neoblackcap  
       2020-09-02 14:10:48 +08:00
    @black11black 不要问我为什么不支持,因为人家设计就是不支持。你可以去查阅对应的文档说明。epoll 只支持网络 IO 。文件 IO 跟网络 IO 虽然看起来都是 fd,但是的确是两种东西。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2578 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 00:31 · PVG 08:31 · LAX 16:31 · JFK 19:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.