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 操作,提高程式的併發能力。