繁体   English   中英

Python 使用 asyncio.run 并尝试添加任务时 asyncio 循环已经运行

[英]Python asyncio loop already running when using asyncio.run and trying to add tasks

我对 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 方法会启动一个不同的事件循环,我无法再访问它了。

我该如何解决这个问题? 为了发泄我的挫败感,这比仅使用线程更容易吗?

当事件循环已经运行时,您不能使用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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM