python - 如何在使用 Python 3 和 asyncio 实时写入文件时读取文件,例如“tail -f”
问题描述
我想在 Linux 上编写一个 Python 程序,它在写入日志文件时实时读取它,以便在它检测到日志中的某些内容时发送警报。我希望它使用 asyncio 有几个原因 - 我正在尝试构建一个基于 asyncio 同时做很多事情的框架,我需要练习。
由于我使用的是 asyncio,我显然不想使用阻塞读取在输入文件的末尾等待更多行写入它。我怀疑我最终将不得不使用 select,但我不确定。
我怀疑这很简单,但我很难找到一个如何做到这一点的例子,或者想出一个我自己的例子,即使我以前在 asyncio 中涉足过一点。我可以阅读并基本理解我找到的其他 asyncio 示例,但由于某种原因,我发现很难编写自己的 asyncio 代码。
因此,如果有人能给我举个例子,我将不胜感激。如果相同的技术也适用于从标准输入而不是文件读取,则加分。
解决方案
我怀疑我最终将不得不使用 select,但我不确定。我怀疑这很简单,但我很难找到一个如何做到这一点的例子
使用 asyncio 的想法是您不需要select()
自己,因为 asyncio 会为您选择 - 毕竟,aselect()
或等效项是每个事件循环的核心。Asyncio 提供了类似于流的抽象,在异步编程模型上实现了协程外观。还有一些较低级别的方法可以让您连接到select()
自己,但通常您应该使用流。
如果是tail -f
,则不能使用select()
,因为常规文件始终是可读的。当没有数据时,您会得到一个 EOF,并预计稍后再试。这就是为什么tail -f
历史上使用带有暂停的读取,并可以选择在可用的地方部署通知 API,例如inotify。
推荐阅读
- yii2 - 更新 Yii2 项目到 php 7.2
- javascript - Jquery中的变量未在javascript中定义
- java - 使用 GenericDAO 插入第二个数据源时出错
- python - Pandas 根据列的每个唯一元素添加行
- php - CodeIgniter Eloquent 模型关系类模型未找到
- php - Prestashop 1.6 加密密码无法重现nodejs中的加密
- android - RXKotlin 中断 doOnNext 并调用另一个函数
- css - React 过渡组滚动聊天
- tensorflow - 如何在对象检测 API Tensorflow 中只检测人类
- git - 在 nodejs 中引用密钥文件的最佳方法