簡體   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