asyncio的基本使用框架,python高效處理資料,asyncio.gather(),asyncio. create_task(),asyncio.run(main())

高顏值的殺生丸發表於2023-04-26

asyncio 是 Python 3.4 引入的標準庫,是一個基於事件迴圈的非同步 I/O 併發庫。它提供了一種協作式的多工處理方式,使得我們能夠在一個執行緒中併發處理多個 I/O 操作。它透過將 I/O 操作轉化為非同步的非阻塞呼叫,從而實現了高效的併發處理。其原理如下:

 

  1. 定義協程(coroutine):使用關鍵字 async def 定義一個協程函式,它是一種特殊的函式,可以暫停執行並在稍後恢復執行。

  2. 建立一個事件迴圈(event loop):事件迴圈是一個無限迴圈,它不斷地等待事件的發生並處理這些事件。在事件迴圈中,我們可以註冊協程、定時器和回撥函式等事件。

  3. 啟動事件迴圈:呼叫事件迴圈的 run_until_complete() 方法,將協程註冊到事件迴圈中並啟動事件迴圈。

  4. 在協程中使用 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 操作,提高程式的併發能力。  

 

相關文章