Python 的非同步處理
本文講解了 Python 中的非同步處理。
你可以學習如何使用 Python 的 async/await 與 asyncio 模組的基本範例程式碼。
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())- 在此範例中,
task1和task2是同時執行的。結果顯示,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 / await 及 asyncio,在等待 I/O 的同時同時執行其他任務,從而實現高效處理。透過多任務的並行執行及非同步 I/O,可以大幅提升效能。另外,你也可以如同一般 try-except 一樣處理錯誤,因此可以安全地執行非同步程式碼。
您可以在我們的 YouTube 頻道上使用 Visual Studio Code 來跟隨上述文章一起學習。 請也查看我們的 YouTube 頻道。