异步编程每秒打印一次按键

时间:2018-08-26 04:25:43

标签: python python-3.x asynchronous io python-asyncio

由于异步编程的示例仍然很少,因此我尝试使用新的async def提出自己的示例。我认为我能做的最基本的例子是一个事件循环,它监听用户输入并将其打印回去。

我想要一个事件循环,它监听用户按下的按键并每秒打印一次。我正在尝试通过使一个任务从键队列中打印出来,以及让第二个任务侦听按下的键并将它们添加到队列中来实现此目的。

我缺少异步聆听按键的好方法。这是我现在拥有的。

import asyncio

KEY_QUEUE = []

async def printer():
    while True:
        await asyncio.sleep(1)
        print('In the last second you pressed:', *KEY_QUEUE)
        KEY_QUEUE.clear()

async def listener():
    while True:
        ... # await a key to be pressed and add it to KEY_QUEUE

loop = asyncio.get_event_loop()

loop.create_task(printer())
loop.create_task(listener())

loop.run_forever()

预期的输出看起来像这样

In the last second you pressed: h e l l o
In the last second you pressed: w o r
In the last second you pressed: l d 
In the last second you pressed:
In the last second you pressed: i t    w o
In the last second you pressed: r k s

我怀疑是否有诸如asyncio.await_pressed_key之类的等待协程,我们将如何继续创建协程?

欢迎使用任何其他方法,而我的目标不是使这个特定的示例正常工作,而是生成有意义的异步程序示例。

1 个答案:

答案 0 :(得分:2)

假设您要从TTY(类Unix系统上的终端设备)读取字符,则在键入字符时访问它们需要:

  • TTY处于“原始模式”,以便系统返回字符而无需等待用户键入换行符;

  • 被阻塞的标准输入将被包装到asyncio非阻塞流中。

前者由Python标准库随附的tty模块提供,而后者由aioconsole第三方库提供。

有了这两个,您的示例可能如下所示:

setState

此示例仅在类似Unix的系统上工作。