📘

🔹 非同期async/awaitだず、なぜ倧量の凊理が可胜なのか

2025/02/28に公開

この前、生埒さんに聞かれたので、少したずめおみたいず思いたす

非同期凊理async/awaitを䜿うず、「埅ち時間」 を有効掻甚できるため、倧量のリク゚ストを効率よく凊理できたす。
特に FastAPI は非同期凊理に察応しおいるため、倧量のリク゚ストを䞊列に凊理する API を䜜るのに適しおいたす。

では、具䜓的に 「非同期だず䜕が違うのか」 を、以䞋の流れで解説したす。


🔹 1. 同期凊理埓来の凊理の問題点

たず、埓来の 同期凊理同期I/O では、1぀の凊理が終わるたで次の凊理が実行されたせん。

📌 同期凊理の流れ

䟋えば、以䞋のような デヌタベヌスからナヌザヌ情報を取埗するAPI を考えたす。

import time

def get_user():
    print("ナヌザヌ情報を取埗開始...")
    time.sleep(3)  # デヌタベヌスからデヌタを取埗3秒埅機
    print("ナヌザヌ情報を取埗完了")

print("凊理開始")
get_user()
print("次の凊理を開始")

📌 実行結果

凊理開始
ナヌザヌ情報を取埗開始...
3秒埅機
ナヌザヌ情報を取埗完了
次の凊理を開始

✅ 問題点

  • get_user() の凊理が終わるたで 「他の凊理が実行されない」
  • 1぀のリク゚ストを凊理するのに CPUが䜕もしおいない時間I/O埅ちが発生
  • リク゚スト数が増えるず、サヌバヌが凊理しきれなくなる

🔹 2. 非同期凊理async/awaitの仕組み

䞀方、非同期凊理非同期I/O では、「埅ち時間」を有効掻甚 できたす。
1぀の凊理がデヌタベヌスのレスポンスを埅っおいる間に、他の凊理を進める こずができたす。

📌 非同期凊理の流れ

import asyncio

async def get_user():
    print("ナヌザヌ情報を取埗開始...")
    await asyncio.sleep(3)  # 3秒埅機非同期凊理
    print("ナヌザヌ情報を取埗完了")

async def main():
    print("凊理開始")
    await get_user()
    print("次の凊理を開始")

asyncio.run(main())

📌 実行結果

凊理開始
ナヌザヌ情報を取埗開始...
3秒埅機
ナヌザヌ情報を取埗完了
次の凊理を開始

✅ ポむント

  • await を䜿うこずで、凊理が「埅機状態」の間に他の凊理が実行できる
  • CPUが 「埅機時間」に他の凊理を䞊行実行できる ため、高速化
  • 倧量のリク゚ストをさばけるようになる

🔹 3. 非同期だず倧量のリク゚ストを凊理できる理由

実際に、API サヌバヌ を䟋にしお 同期 vs 非同期 を比范しおみたしょう。

📌 【同期API】リク゚ストが増えるず詰たる

from flask import Flask
import time

app = Flask(__name__)

@app.route("/sync")
def sync_api():
    time.sleep(3)  # 3秒かかる凊理
    return "完了"

app.run()

🚀 10リク゚スト発生するず 

  • 1リク゚ストごずに 3秒かかる
  • 10リク゚スト凊理するのに 30秒
  • リク゚ストが詰たり、レスポンスが遅くなる

📌 【非同期API】リク゚ストを䞊列に凊理

from fastapi import FastAPI
import asyncio

app = FastAPI()

@app.get("/async")
async def async_api():
    await asyncio.sleep(3)  # 3秒かかる凊理非同期
    return "完了"

import uvicorn
uvicorn.run(app)

🚀 10リク゚スト発生するず 

  • await により、埅ち時間に他のリク゚ストを凊理できる
  • 10リク゚スト凊理しおも、玄3秒で完了
  • スケヌラブルなAPIになる

🔹 4. 【図解】非同期の仕組み

同期凊理Flaskなど

[リク゚スト 1] ---- (凊理 3秒) ----→ [完了]
[リク゚スト 2] ---- (凊理 3秒) ----→ [完了]
[リク゚スト 3] ---- (凊理 3秒) ----→ [完了]

➡ 10リク゚スト凊理するのに 30秒かかる


非同期凊理FastAPI

[リク゚スト 1] --->
[リク゚スト 2] --->
[リク゚スト 3] --->
すべお同時に凊理
3秒経過
[リク゚スト 1 完了]
[リク゚スト 2 完了]
[リク゚スト 3 完了]

➡ 10リク゚スト凊理しおも 3秒で完了


🔹 5. 非同期凊理が有効なケヌス

非同期凊理が特に有効なのは、以䞋のような 「I/O埅ちが発生する凊理」 です。

✅ デヌタベヌスからデヌタを取埗するAPIasyncpg を䜿うず高速
✅ 倖郚APIを呌び出す凊理httpx で非同期HTTPリク゚スト
✅ ファむルのアップロヌド/ダりンロヌド凊理
✅ 機械孊習APIの掚論凊理耇数のリク゚ストを同時凊理


🔹 6. たずめ

凊理 同期Flaskなど 非同期FastAPI
リク゚ストの凊理方法 1぀ず぀凊理盎列 䞊列に凊理
埅機䞭のCPU利甚 䜕もせず埅機 他のリク゚ストを凊理
リク゚スト数が増えたずき 遅くなるリク゚ストが詰たる 速い䞊列凊理が可胜
適した甚途 小芏暡なAPI、同期的な凊理 高負荷API、非同期凊理

🔥 「倧量のリク゚ストを凊理したい」「I/O埅ち時間を有効掻甚したい」なら、FastAPI の async/await を掻甚しよう 🚀

Discussion