首页 > 解决方案 > 如何在使用 Python 3 和 asyncio 实时写入文件时读取文件,例如“tail -f”

问题描述

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

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

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

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

标签: pythonlinuxfile-iopython-asyncio

解决方案


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

使用 asyncio 的想法是您不需要select()自己,因为 asyncio 会为您选择 - 毕竟,aselect()或等效项是每个事件循环的核心。Asyncio 提供了类似于的抽象,在异步编程模型上实现了协程外观。还有一些较低级别的方法可以让您连接到select()自己,但通常您应该使用流。

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


推荐阅读