首页 > 解决方案 > 使用选择器的非阻塞标准输入

问题描述

玩弄非阻塞控制台输入,将 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 运行它。)

标签: pythonselectstdin

解决方案


推荐阅读