python - 使用选择器的非阻塞标准输入
问题描述
玩弄非阻塞控制台输入,将 Pythonselectors
与 结合使用sys.stdin
,有一些我不明白的地方:
假设我想在用户按下 时退出循环Enter,可能是在先输入一些其他字符之后。
如果我执行阻塞读取,如下所示,该过程总是在\n
它遇到的第一个换行符之后完成,如预期的那样,无论前面的任何字符如何:
import sys
character = ''
while character != '\n':
character = sys.stdin.read(1)
现在考虑以下非阻塞读取的最小化示例:
import sys
import selectors
selector = selectors.DefaultSelector()
selector.register(fileobj=sys.stdin, events=selectors.EVENT_READ)
character = ''
while character != '\n':
for key, __ in selector.select(timeout=0):
character = key.fileobj.read(1)
如果我Enter作为第一个输入点击,则会生成一个换行符,并且该过程按预期完成。
但是,如果我先输入一些其他字符,然后再输入Enter,则该过程不会完成:我需要Enter再次点击才能完成。
显然,此实现仅在换行符是第一个输入时才有效。
这可能有一个很好的理由,但我目前没有看到它,也找不到任何相关的问题。
这是否与我的非阻塞实现有关,或者它是一个stdin
缓冲区,或者可能与控制台或终端实现有关?
(我从 ubuntu 上的 python 3.8 shell 运行它。)
解决方案
推荐阅读
- mapstruct - MapStruct:如何映射作为源只有一个对象的对象列表
- python - 在 Django 中使用表单更新一对一模型
- python - 为什么我无法在 Keras 中加载我保存的连体模型?
- angularjs - 将现有捆绑的 JavaScript WebPack 模块与 TypeScript 结合并重新捆绑它们
- android - 迁移到 androidx 后的 ShareActionProvider NPE
- javascript - 故事书:moduleMetadata 不加载所需的服务、模块等
- twitter-bootstrap - 如何在桌面上按原样呈现移动视图?
- git - 如何在詹金斯管道中提取 Git 分支
- reactjs - 如何成功地为 a 设置 ref
- javascript - 在 DataTable 中搜索时禁用特定行