iT邦幫忙

2025 iThome 鐵人賽

DAY 3
0

接下來這幾天,會花點時間介紹 Python 的基礎知識,等大家都具備「同步/非同步」與「程序/執行緒 (process/thread)」的觀念後,再來向大家說明 def 與 async def 之間的差異。讓我們先從「同步/非同步」這個路線開始吧!

前言

在開始深入 FastAPI 的世界之前,我們必須先理解一個核心的概念:同步與非同步程式設計。這不僅是理解 FastAPI 高效能特性的基礎,更是在 AI 服務開發中實現高併發處理的關鍵知識。

想像一下,當你的 AI 模型需要同時處理數百個影像辨識請求時,如果採用傳統的同步方式,每個請求都需要等待前一個完成,這將造成巨大的延遲。而非同步程式設計則能讓我們在等待一個模型推理的同時,開始處理下一個請求,大幅提升整體效能。

同步程式設計:一步一腳印的執行方式

同步的基本特性

同步程式設計是我們最熟悉的程式執行方式,具有以下特性:

  1. 順序執行:程式碼從上到下依序執行
  2. 阻塞等待:當前任務未完成時,程式會等待,不會執行下一行
  3. 簡單直觀:程式流程清晰,易於理解和除錯
import time

def process_image_sync(image_id):
    print(f"開始處理圖像 {image_id}")
    time.sleep(2)  # 模擬 AI 模型推理需要 2 秒
    print(f"圖像 {image_id} 處理完成")
    return f"result_{image_id}"

def main_sync():
    start_time = time.time()
    
    # 依序處理三張圖像
    result1 = process_image_sync(1)
    result2 = process_image_sync(2)
    result3 = process_image_sync(3)
    
    end_time = time.time()
    print(f"總處理時間:{end_time - start_time:.2f} 秒")
    print(f"處理結果:{[result1, result2, result3]}")

# 執行結果:總共需要 6 秒
main_sync()

同步的限制

在 AI 服務中,同步處理有幾個明顯的限制:

  • 資源浪費:在等待 I/O 操作(如檔案讀取、網路請求)時,CPU 閒置
  • 低併發能力:無法同時處理多個請求
  • 用戶體驗差:響應時間長,特別是在高負載情況下

非同步程式設計:多工並行的執行方式

非同步的核心思想

非同步程式設計改變了程式執行的根本方式:

  1. 並行執行:多個任務可以「同時」進行
  2. 非阻塞:在等待 I/O 操作時,可以切換到其他任務
  3. 事件驅動:基於事件來調度任務執行
import asyncio
import time

async def process_image_async(image_id):
    print(f"開始處理圖像 {image_id}")
    await asyncio.sleep(2)  # 模擬非同步 AI 模型推理
    print(f"圖像 {image_id} 處理完成")
    return f"result_{image_id}"

async def main_async():
    start_time = time.time()
    
    # 並行處理三張圖像
    tasks = [
        process_image_async(1),
        process_image_async(2),
        process_image_async(3)
    ]
    
    results = await asyncio.gather(*tasks)
    
    end_time = time.time()
    print(f"總處理時間:{end_time - start_time:.2f} 秒")
    print(f"處理結果:{results}")

# 執行結果:總共只需要 2 秒
asyncio.run(main_async())

生活中的類比:理解同步與非同步

為了更好地理解這兩種模式,讓我們用生活中的例子來類比:

同步模式:買完一個東西再買下一個

想像你要買手搖杯和隔壁的紅豆餅:

  • 你先排隊買飲料,等飲料完全做好、拿到手後,才走到隔壁紅豆餅店排隊
  • 在等待飲料的過程中,你不能先去處理紅豆餅的訂單
  • 流程簡單,容易理解,但等待時間較長,效率較低

非同步模式:同時進行多件事

換個做法:

  • 你在飲料店點完飲料後,店員正在製作時,你立刻走去隔壁紅豆餅店排隊點餐
  • 接下來可以一起等待,看哪個先做好就先去拿
  • 這樣一來,你同時處理兩件事,節省總等待時間,效率更高

小結

同步與非同步程式設計代表了兩種不同的思維方式。同步注重順序與確定性,非同步追求效率與並行。在 AI 服務的世界中,非同步程式設計能夠幫我們:

  • 提升服務的響應速度
  • 增加系統的併發處理能力
  • 更有效地利用硬體資源
  • 提供更好的用戶體驗

理解了這些基礎概念後,我們就準備好深入探索 FastAPI 的非同步世界了。在下一篇文章中,我們將學習協程(Coroutine)與事件迴圈(Event Loop)的具體實作,這是 Python 非同步程式設計的核心機制。


上一篇
[Day 02] FastAPI 簡介
下一篇
[Day 04] 協程與事件迴圈
系列文
用 FastAPI 打造你的 AI 服務6
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言