FastAPI を支える uvicorn の役割を解説
はじめに
FastAPI を使っていると、次のようにアプリを起動すると思います。
uvicorn main:app --reload
そもそも uvicorn とは何なのか?
なぜ FastAPI を使うのに uvicorn が必要なのか?
本記事では、難しい内部構造には踏み込まず、
初心者の方向けに uvicorn の役割 をまとめます。
補足: uvicorn main:app の意味
まず、起動コマンドの意味を簡単に説明します。
# main.py
from fastapi import FastAPI
app = FastAPI() # ← この app オブジェクトを uvicorn に渡す
@app.get("/")
def read_root():
return {"message": "Hello World"}
uvicorn main:app --reload
-
main→main.pyファイル -
app→ その中のappオブジェクト -
--reload→ ファイル変更時に自動再起動(開発時のみ使用)
つまり、「 main.py の中の app を uvicorn で起動してください」 という意味です。
結論:uvicorn は FastAPI を動かす “エンジン”
FastAPI のコードは、そのままでは Webサーバーとして動きません。
外部からの HTTP リクエストを受け取り、FastAPI に渡し、
レスポンスを返す役割が必要です。
その役割を担うのが uvicorn です。
イメージとしては:
- FastAPI → 車の車体(アプリ本体)
- uvicorn → エンジン(アプリを動かす仕組み)
uvicorn があることで、FastAPI は実際にWebサーバーとして動作します。
uvicorn の正体:ASGIサーバー
uvicorn は ASGI サーバー と呼ばれる種類の Web サーバーです。
ASGI とは Python の非同期 Web アプリケーションの標準仕様で、
- 非同期(async/await)
- WebSocket
- 高速な処理
に対応しています。
FastAPI は ASGI アプリのため、
ASGI サーバーである uvicorn が必要 になります。
uvicorn が担っている主な役割
① リクエストを受け取る(HTTP / WebSocket)
FastAPI 自体にはネットワーク通信を行う機能がありません。
uvicorn がポートを開き、HTTPリクエストを受け取ります。
② FastAPI に処理を渡す
リクエストを FastAPI に渡し、
FastAPI が返した内容をレスポンスとして返します。
③ async/await の処理をスケジュールする
FastAPI が高速なのは async/await を使えるからですが、
その非同期処理を管理しているのは uvicorn が提供する
イベントループ(asyncio)です。
④ 開発を便利にする(--reload)
ファイルを変更すると自動でリロードする機能なども
uvicorn が提供しています。
初心者のうちは この4つを押さえれば十分 です。
なぜ「FastAPI を使う=uvicorn が必要」なのか?
FastAPI はただの「アプリ本体」。
- リクエストを受け取る
- 非同期処理を管理する
- WebSocket を扱う
- レスポンスを返す
これらを行う実行環境を持っていません。
そこで uvicorn が“実行エンジン”としてその役割を肩代わりしている
という関係になっています。
おわりに
FastAPI を触り始めたばかりの頃は、
- とりあえず
uvicorn main:appを実行している - けれど、uvicorn がどんな役割を担っているのかまでは意識していない
というケースも少なくありません。
uvicorn の位置づけがわかると、
FastAPI がどのように動いているのかがより理解しやすくなります。
まずは、
- FastAPI = アプリ本体
- uvicorn = アプリを動かすエンジン(ASGIサーバー)
といったイメージを持っておくだけでも十分です。
本記事が参考になれば幸いです。
Discussion