---
# System prepended metadata

title: WSGI 和 ASGI
tags: [webdev]

---

# WSGI 和 ASGI
## 什麼是 WSGI 和 ASGI
WSGI 和 ASGI 都是 Python 網頁開發的常見名詞， WSGI 為 Web Server Gateway Interface，ASGI 為 Asynchronous Server Gateway Interface。兩者主要功能一致，都是網路伺服器（如 Apache、Nginx等）和後端應用程式間通訊的接口標準，而基於 WSGI 或 ASGI 運行的伺服器才真正是兩者溝通的橋樑。需要橋樑存在的理由很簡單，因為網頁伺服器看不懂 Python，需要一定的翻譯才能運行順暢。同時，這樣可以將應用邏輯端和網路流量端拆分開來，各自只需關注自己的業務與強項，不必分心他物。假使有需要的話，也可以很輕易地更換相應的配套，適應業務場景，不必拘泥於綁定的系統。

## 兩者的差別
它們的主要區別在於處理請求的方式和應用場景。就字面上來說，WSGI 和 ASGI 最大的差別在於，WSGI 是 Synchronous （同步的），而 ASGI 是 Asynchronous （非同步的）。
1. WSGI
    全稱: Web Server Gateway Interface
    同步處理: WSGI 是為同步 Web 應用程式設計的。每個請求在一個執行緒（Thread）或進程（Process）中處理，直到完成回應。適用於大多數傳統的 Web 應用，比如基於 Django 和 Flask 的應用。
    性能限制: 由於 WSGI 的同步性，在處理 I/O 密集型任務（如資料庫查詢或與外部 API 的通信）時，可能會導致性能瓶頸（throttle），因為每個請求必須等待其他請求完成。

2. ASGI
    全稱: Asynchronous Server Gateway Interface
    非同步處理: ASGI 是為非同步 Web 應用程式設計的。它支援異步處理，允許在單個執行緒中處理多個請求。適合處理 WebSocket、Long Polling 等實時通訊需求，或者需要高併發的應用。
    擴展性: ASGI 可以處理多種協議（HTTP、WebSocket 等），適合現代 Web 應用，特別是需要非同步處理的應用，比如基於 FastAPI 或 Django Channels 的應用。

適用場景：
    WSGI 適用於傳統的 Web 應用程式和不需要異步處理的場景。
    ASGI 適用於現代 Web 應用程式，特別是需要處理高併發或實時通訊的場景。
