我正在尝试创建一个WebSocket命令行客户端,该客户端等待来自WebSocket服务器的消息,但同时等待用户输入。
每秒钟定期轮询多个在线资源在服务器上工作正常(在此示例中,该资源在localhost:6789
上运行),但是它没有使用Python的常规sleep()
方法,而是使用{{1} },这是有道理的,因为睡眠和异步睡眠不是一回事,至少不是在后台。
类似地,等待用户输入和异步等待用户输入不是同一回事,但是我无法弄清楚如何异步地等待用户输入,就像我可以异步地等待任意数量的输入一样。秒,以便客户端可以处理来自WebSocket服务器的传入消息,同时等待用户输入。
在asyncio.sleep()
的{{1}}子句中,以下评论有望解释我的意思:
else
这段代码只是无限期地等待输入,与此同时,它什么也不做,我明白为什么。我不明白的是如何解决它。 :)
当然,如果我以错误的方式考虑这个问题,我将很高兴学习如何也可以对此进行补救。
答案 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)