【问题标题】:Python asyncio loop already running when using asyncio.run and trying to add tasks使用 asyncio.run 并尝试添加任务时 Python asyncio 循环已在运行
【发布时间】: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


    【解决方案1】:

    当事件循环已经运行时,您不能使用loop.run_forever()。例如,以下代码将不起作用:

    import asyncio
    
    async def main():
        loop=asyncio.get_running_loop()
        loop.run_forever()
    
    if __name__ == '__main__':
        asyncio.run(main())
    

    但是这段代码可以工作,并且具有您正在寻找的“永远运行”的行为:

    import asyncio
    
    async def do_ui():
        while True:
            await asyncio.sleep(1)
            print('doing ui')
    
    async def main():
        loop = asyncio.get_running_loop()
        loop.create_task(do_ui())
        # insert game server code here
    
    
    if __name__ == '__main__':
        loop = asyncio.get_event_loop()
        loop.create_task(main())
        loop.run_forever()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-14
      • 2018-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多