【问题标题】:How to read a file as it is being written in real time with Python 3 and asyncio, like "tail -f"如何在使用 Python 3 和 asyncio 实时写入文件时读取文件,例如“tail -f”
【发布时间】:2019-02-02 11:22:42
【问题描述】:

我想在 Linux 上编写一个 Python 程序,它可以在写入日志文件时实时读取它,以便在它检测到日志中的某些内容时发送警报。我希望它使用 asyncio 有几个原因 - 我正在尝试构建一个基于 asyncio 同时执行许多操作的框架,我需要练习。

由于我使用的是 asyncio,我显然不想使用阻塞读取在输入文件的末尾等待更多行写入。我怀疑我最终将不得不使用 select,但我不确定。

我怀疑这很简单,但我很难找到一个如何做到这一点的例子,或者想出一个我自己的例子,即使我以前涉足过 asyncio。我可以阅读并基本理解我找到的其他 asyncio 示例,但由于某种原因,我发现自己编写 asyncio 代码很困难。

因此,如果有人能给我举个例子,我将不胜感激。如果同样的技术也适用于从标准输入而不是文件读取,则加分。

【问题讨论】:

  • with open() 支持这一点。每个新的read() 将从文件中的最后一个光标位置继续。如果有新数据,read() 将获取它。 f.tell() 会告诉你你在文件中的位置。
  • select 可能是您最好的选择,或者检查文件的os.stat(f).m_time。或者,使用here 中提到的一种方法来确定您应该何时进行阅读。我不是 asyncio 的忠实粉丝,但也许值得一看。
  • 不会read() 立即返回EOF,还是什么?
  • 相信你,小家伙:i.imgur.com/IHmrCyu.png(注意末尾的 6,read() 没有阻塞。它将继续返回 f.data[f.curpos:],在次。
  • 我明白了,谢谢。是的,我想这是可行的。我原以为我会使用'await fh.async_read()'之类的东西。

标签: python linux file-io python-asyncio


【解决方案1】:

我怀疑我最终将不得不使用 select,但我不确定。我怀疑这很简单,但我很难找到一个如何做到这一点的例子

使用 asyncio,您不需要自己 select(),因为 asyncio 会为您选择 - 毕竟,select() 或等效项是每个事件循环的核心。 Asyncio 提供了像 streams 这样的抽象,它们在异步编程模型上实现了协程外观。还有lower-level 方法可以让您自己挂钩select(),但通常您应该使用流。

对于tail -f,您不能使用select(),因为常规文件始终是可读的。当没有数据时,您会得到一个 EOF,并预计稍后再试。这就是为什么 tail -f 历来使用带暂停的读取,并可以选择在可用的情况下部署通知 API,例如 inotify

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-31
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    相关资源
    最近更新 更多