asyncio
是 Python 中用於編寫非同步代碼的標準庫,用於實現非步程式設計(asynchronous programming)。它允許你編寫高效的 I/O 密集型應用程序,例如網絡爬蟲、Web 服務器、即時通訊系統等。通過使用 asyncio
,你可以避免傳統同步編程中的阻塞問題,從而提升程序的性能。
在同步編程中,代碼是有順序執行的。當一個任務需要等待 I/O 操作(例如網絡請求或文件讀寫)時,整個程序會被阻塞,直到該操作完成。
import time
def sync_task():
print("開始任務")
time.sleep(2) # 模擬 I/O 操作
print("任務完成")
sync_task()
在非同步編程中,當一個任務需要等待 I/O 操作時,程序會切換到其他任務,從而避免阻塞。這使得程序能夠更高效地利用資源。
import asyncio
async def async_task():
print("開始任務")
await asyncio.sleep(2) # 模擬 I/O 操作
print("任務完成")
asyncio.run(async_task())
await
的作用
在 async
函數內部,await
用於等待異步操作完成。例如,await asyncio.sleep(2)
讓程式暫停 2秒,但不會阻塞其他異步任務。
我們可以使用 asyncio.create_task()
來同時執行多個異步任務
import asyncio
async def task(name, seconds):
print(f"{name} 開始")
await asyncio.sleep(seconds)
print(f"{name} 完成")
async def main():
task1 = asyncio.create_task(task("任務1", 2))
task2 = asyncio.create_task(task("任務2", 1))
await task1
await task2
asyncio.run(main())
asyncio.create_task()
的作用
是對協程的進一步封裝,它允許你並發地執行多個協程。可以使用 asyncio.create_task()
來創建任務。
可以看到,任務 2 比任務 1 早完成,但它們是同時開始的,這就是異步執行的效果。
asyncio.gather()
併發執行多個任務如果我們想一次執行多個異步函數並等待所有結果,可以使用 asyncio.gather()
。
import asyncio
async def fetch_data(name, seconds):
await asyncio.sleep(seconds)
return f"{name} 數據獲取完成"
async def main():
results = await asyncio.gather(
fetch_data("API 1", 2),
fetch_data("API 2", 1),
fetch_data("API 3", 3)
)
print(results)
asyncio.run(main())
asyncio.gather()
vs asyncio.create_task()
asyncio.create_task()
創建的任務是獨立執行的,不能直接返回結果。asyncio.gather()
用於並行執行多個異步函數,並收集返回值。asyncio
是 Python 標準庫中強大的非同步工具,能夠顯著提升 I/O 密集型應用的性能。本篇文章介紹了:
asyncio
的基礎概念與優勢await
的作用asyncio.create_task()
來並發執行多個任務asyncio.gather()
來同時執行並獲取結果透過這些技巧,你可以更有效率地開發高性能的 Python 應用程式。如果你有任何問題或建議,歡迎在下方留言討論。