asyncio
是 Python 3.4 引入的標準庫,是一個基於事件循環的異步 I/O 併發庫。它提供了一種協作式的多任務處理方式,使得我們能夠在一個線程中併發處理多個 I/O 操作。它通過將 I/O 操作轉化爲異步的非阻塞調用,從而實現了高效的併發處理。其原理如下:
-
定義協程(coroutine):使用關鍵字
async def
定義一個協程函數,它是一種特殊的函數,可以暫停執行並在稍後恢復執行。 -
創建一個事件循環(event loop):事件循環是一個無限循環,它不斷地等待事件的發生並處理這些事件。在事件循環中,我們可以註冊協程、定時器和回調函數等事件。
-
啓動事件循環:調用事件循環的
run_until_complete()
方法,將協程註冊到事件循環中並啓動事件循環。 -
在協程中使用
await
:使用關鍵字await
可以暫停當前協程的執行,等待另一個協程或異步操作完成後再恢復執行。
下面是一個使用 asyncio
實現異步框架程序的示例,創建一個任務列表,列表中有 100 個任務,每個任務是返回一個數字,數字從 0 開始。
import asyncio async def get_number(n): await asyncio.sleep(1) # 模擬耗時操作 return n async def main(): tasks = [] for i in range(100): tasks.append(asyncio.create_task(get_number(i))) numbers = await asyncio.gather(*tasks) print(numbers) if __name__ == '__main__': asyncio.run(main())
上述代碼中,我們定義了一個 get_number()
協程函數,它模擬一個耗時操作並返回一個數字。然後我們在 main()
協程中創建了一個包含 100 個任務的任務列表,每個任務都是調用 get_number()
函數。最後,我們使用 asyncio.gather()
方法等待所有任務完成,並打印出所有數字。在最後,我們使用 asyncio.run()
函數來啓動事件循環。這個示例程序使用 asyncio
實現了一個簡單的異步框架,可以在一個線程中同時處理多個 I/O 操作,提高程序的併發能力。