我想在 Linux 上编写一个 Python 程序,它在写入日志文件时实时读取日志文件,以便在检测到日志中的某些内容时发送警报。我希望它使用 asyncio 有几个原因 - 我正在尝试构建一个基于 asyncio 同时做很多事情的框架,我需要实践。
因为我使用的是 asyncio,所以我显然不想使用阻塞读取来等待输入文件末尾写入更多行。我怀疑我最终不得不使用 select,但我不确定。
我怀疑这很简单,但我很难找到一个示例来说明如何执行此操作,或者想出一个我自己的示例,即使我之前已经涉足了一点 asyncio。我可以阅读并基本理解我找到的其他 asyncio 示例,但出于某种原因,我发现很难编写自己的 asyncio 代码。
因此,如果有人能给我举个例子,我将不胜感激。如果相同的技术也适用于从标准输入而不是文件读取,则加分。
最佳答案
I suspect I'll have to end up using select, but I'm not sure. I suspect that this is pretty simple, but I have a hard time finding an example of how to do this
使用 asyncio 的想法是,您不需要自己select()
,因为 asyncio 会为您选择 - 毕竟,select()
或等效项是在每个事件循环的核心。 Asyncio 提供类似 streams 的抽象在异步编程模型上实现协程外观。还有 lower-level允许您自己挂接到 select()
的方法,但通常您应该使用流。
在 tail -f
的情况下,您不能使用 select()
,因为常规文件总是可读的。当没有数据时,您会收到一个 EOF,并希望稍后重试。这就是为什么 tail -f
过去使用暂停读取,并可以选择部署通知 API,如 inotify在可用的地方。
关于python - 如何在使用 Python 3 和 asyncio 实时写入文件时读取文件,例如 "tail -f",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54492569/