![](/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.