Python异步:在执行其他操作时等待标准输入

时间:2019-10-18 15:44:04

标签: python-3.x python-asyncio

我正在尝试创建一个WebSocket命令行客户端,该客户端等待来自WebSocket服务器的消息,但同时等待用户输入。

每秒钟定期轮询多个在线资源在服务器上工作正常(在此示例中,该资源在localhost:6789上运行),但是它没有使用Python的常规sleep()方法,而是使用{{1} },这是有道理的,因为睡眠和异步睡眠不是一回事,至少不是在后台。

类似地,等待用户输入和异步等待用户输入不是同一回事,但是我无法弄清楚如何异步地等待用户输入,就像我可以异步地等待任意数量的输入一样。秒,以便客户端可以处理来自WebSocket服务器的传入消息,同时等待用户输入。

asyncio.sleep()的{​​{1}}子句中,以下评论有望解释我的意思:

else

这段代码只是无限期地等待输入,与此同时,它什么也不做,我明白为什么。我不明白的是如何解决它。 :)

当然,如果我以错误的方式考虑这个问题,我将很高兴学习如何也可以对此进行补救。

2 个答案:

答案 0 :(得分:1)

您可以使用aioconsole第三方程序包以异步友好的方式与stdin进行交互:

line = await aioconsole.ainput('Is this your line? ')

答案 1 :(得分:1)

大量借用aioconsole,如果您不想使用外部库,则可以定义自己的异步输入函数:

async def ainput(string: str) -> str:
    await asyncio.get_event_loop().run_in_executor(
            None, lambda s=string: sys.stdout.write(s+' '))
    return await asyncio.get_event_loop().run_in_executor(
            None, sys.stdin.readline)