Python 的非同步處理

Python 的非同步處理

本文講解了 Python 中的非同步處理。

你可以學習如何使用 Python 的 async/awaitasyncio 模組的基本範例程式碼。

YouTube Video

Python 的非同步處理

Python 中的非同步處理是一種有效處理耗時 I/O 操作(例如檔案讀寫或網路通信)的機制。在同步處理中,下一個操作必須等到目前的操作完成後才能進行;而非同步處理則允許你在等待的期間繼續執行其他任務。在 Python 中,提供了 asyncio 模組用於執行非同步處理。在這裡,我們將依步驟說明其基本元素及用法。

基本語法

非同步處理的核心是稱為 協程(coroutines)的函式。async 函數用來定義非同步函數,而 await 用於在這些函數中等待非同步任務完成。

 1import asyncio
 2
 3async def say_hello():
 4    print("Hello")
 5    await asyncio.sleep(1)
 6    print("World")
 7
 8if __name__ == "__main__":
 9    # Execute asynchronous task
10    asyncio.run(say_hello())
  • 在上述程式碼中,say_hello 函數被定義為一個非同步任務。在用sleep()等待1秒時,其他非同步任務可能會被執行。

執行多個任務

通過使用asyncio模組的gather函數,你可以同時運行多個任務。

 1import asyncio
 2
 3async def task1():
 4    print("Task 1 started")
 5    await asyncio.sleep(2)
 6    print("Task 1 completed")
 7
 8async def task2():
 9    print("Task 2 started")
10    await asyncio.sleep(1)
11    print("Task 2 completed")
12
13async def main():
14    await asyncio.gather(task1(), task2())
15
16if __name__ == "__main__":
17    asyncio.run(main())
  • 在此範例中,task1task2 是同時執行的。結果顯示,task2 在這兩個任務中最先完成,但總執行時間等於最長任務的執行時間。

錯誤處理

即便是在非同步處理中,錯誤處理仍然非常重要。可以使用標準的 try-except 語法來捕捉和處理錯誤。

 1import asyncio
 2
 3async def faulty_task():
 4    raise Exception("An error occurred")
 5
 6async def main():
 7    try:
 8        await faulty_task()
 9    except Exception as e:
10        print(f"Caught an error: {e}")
11
12if __name__ == "__main__":
13    asyncio.run(main())
  • 此程式碼展示了如何透過 try-except 捕捉在非同步函式中發生的例外,並安全地處理錯誤訊息。faulty_task 所產生的例外在 main 內被捕捉並正確輸出。

總結

Python 的非同步處理利用 async / awaitasyncio,在等待 I/O 的同時同時執行其他任務,從而實現高效處理。透過多任務的並行執行及非同步 I/O,可以大幅提升效能。另外,你也可以如同一般 try-except 一樣處理錯誤,因此可以安全地執行非同步程式碼。

您可以在我們的 YouTube 頻道上使用 Visual Studio Code 來跟隨上述文章一起學習。 請也查看我們的 YouTube 頻道。

YouTube Video