![](/img/trans.png)
[英]RuntimeError: asyncio.run() cannot be called from a running event loop
[英]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.