【发布时间】:2022-01-24 14:42:27
【问题描述】:
我对 asyncio 非常陌生,我发现 EchoServer 示例非常令人困惑。我试图实现一个简单的情况,其中服务器接受多个客户端,在协程中运行并处理数据,以及处理 ncurses 输入的 UI 线程。我目前有以下内容,在代码中传达了我的想法。但它不起作用。
import asyncio
async def do_ui():
await asyncio.sleep(1)
print('doing')
await do_ui()
async def run_game():
loop = asyncio.get_running_loop()
server = await GameServer.create_server()
loop.create_task(server.serve_forever())
loop.create_task(do_ui())
loop.run_forever()
def run():
asyncio.run(run_game())
问题从 GameServer.create_server 开始,出于封装原因,我希望将创建服务器委托给该处。然而,这是一个异步操作(出于某种原因),因此必须等待。见下面的服务器代码:
class GameServer:
@staticmethod
async def create_server():
loop = asyncio.get_running_loop()
return await loop.create_server(
lambda: GameServerProtocol(),
'127.0.0.1', 8888
)
这迫使我也使 run_game 异步并在 run 方法中等待它,这是我的 setup.py 入口点,所以我不能这样做。但是,使用 asyncio.run 方法会启动一个不同的事件循环,我无法再访问它了。
我该如何解决这个问题?为了发泄我的挫败感,这怎么比只使用线程更容易?
【问题讨论】:
标签: python server python-asyncio