🔖

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
  • mainmain.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