python - 如何在使用 Python 3 和 asyncio 实时写入文件时读取文件,例如 "tail -f"

标签 python linux file-io python-asyncio

我想在 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/

相关文章:

python - ImageMagick: OSError:/lib/libc.so.6: 找不到版本 `GLIBC_2.XX'

linux - 获取正在路由的数据包

linux - 目标机器上未安装 GTK+ libgio-2.0.so.0

linux - 将带有文件列表的 shell 脚本转换为 ant build.xml

python - 在python3中的csv文件的特定行之后添加一个新行

python - 根据列标题获取Excel列字母 - Python

python - 属性错误 : 'str' object has no attribute 'Substr'

python - Python 中内置的最大堆 API

c - 使用 fscanf() 忽略换行符

c++ - 根据用户输入打开文件