Python 使用 asyncio.run 并尝试添加任务时,asyncio 循环已经 运行
Python asyncio loop already running when using asyncio.run and trying to add tasks
我是 asyncio 的新手,我发现 EchoServer 示例非常令人困惑。我正在尝试实现一个简单的情况,其中服务器接受多个客户端,运行s 在协程中处理数据,UI 线程处理 ncurses 输入。我目前有以下内容,在代码中传达了我的想法。但是没用。
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 异步并在 运行 方法中等待它,这是我的 setup.py 入口点,所以我不能那样做。然而,使用 asyncio.run 方法会启动一个不同的事件循环,我无法再访问它了。
我该如何解决这个问题?为了发泄我的挫败感,这比使用线程有什么简单的方法?
当事件循环已经 运行ning 时,您不能使用 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()
我是 asyncio 的新手,我发现 EchoServer 示例非常令人困惑。我正在尝试实现一个简单的情况,其中服务器接受多个客户端,运行s 在协程中处理数据,UI 线程处理 ncurses 输入。我目前有以下内容,在代码中传达了我的想法。但是没用。
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 异步并在 运行 方法中等待它,这是我的 setup.py 入口点,所以我不能那样做。然而,使用 asyncio.run 方法会启动一个不同的事件循环,我无法再访问它了。
我该如何解决这个问题?为了发泄我的挫败感,这比使用线程有什么简单的方法?
当事件循环已经 运行ning 时,您不能使用 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()