ð¹ éåæïŒasync/awaitïŒã ãšããªã倧éã®åŠçãå¯èœãªã®ãïŒ
ãã®åãçåŸããã«èãããã®ã§ãå°ããŸãšããŠã¿ãããšæããŸã
éåæåŠçïŒ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