* Update all * ðš Auto format * Add missing * ðš Auto format --------- Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
28 KiB
䞊è¡åŠçãš async / await
path operation 颿°ã®ããã® async def æ§æã«é¢ãã詳现ãšãéåæã³ãŒãã䞊è¡åŠçã䞊ååŠçã®èæ¯ã«ã€ããŠã§ãã
æ¥ãã§ããŸããïŒ
TL;DR:
次ã®ããã« await ã§åŒã³åºãããæç€ºãããŠãããµãŒãããŒãã£ã©ã€ãã©ãªã䜿ã£ãŠãããªã:
results = await some_library()
path operation 颿°ã¯æ¬¡ã®ããã« async def ã§å®£èšããŸã:
@app.get('/')
async def read_results():
results = await some_library()
return results
/// note | åè
await 㯠async def ã§äœããã颿°ã®å
éšã§ãã䜿ããŸããã
///
ããŒã¿ããŒã¹ãAPIããã¡ã€ã«ã·ã¹ãã ãªã©ãšéä¿¡ãã€ã€ await ã®äœ¿çšããµããŒãããŠããªããµãŒãããŒãã£ã©ã€ãã©ãª (çŸåšã®ãšããå€ãã®ããŒã¿ããŒã¹ã©ã€ãã©ãªã該åœããŸã) ã䜿ã£ãŠããå Žåãpath operation 颿°ã¯éåžžã©ãã def ã§å®£èšããŠãã ãã:
@app.get('/')
def results():
results = some_library()
return results
ã¢ããªã±ãŒã·ã§ã³ã (äœããã®çç±ã§) ã»ãã®äœãšãéä¿¡ããå¿çãåŸ
ã€å¿
èŠããªããªããawait ãå
éšã§äœ¿ããªããŠã async def ã䜿ã£ãŠãã ããã
ããåãããªãå Žåã¯ãéåžžã® def ã䜿ã£ãŠãã ããã
åè: å¿
èŠã«å¿ã㊠path operation 颿° ã§ã¯ def ãš async def ãæ··åšãããããããã«æé©ãªéžæè¢ã§å®çŸ©ã§ããŸããFastAPI ã¯é©åã«åŠçããŸãã
ãããã®å Žåã§ããFastAPI ã¯éåæã§åäœãéåžžã«é«éã§ãã
ãã ãäžèšã®æé ã«åŸãããšã§ãããã«ããã©ãŒãã³ã¹æé©åãå¯èœã«ãªããŸãã
æè¡è©³çް
ã¢ãã³ãª Python 㯠ãéåæã³ãŒãã ã ãã³ã«ãŒãã³ã ãšåŒã°ããä»çµã¿ã§ãµããŒãããŠãããæ§æã¯ async ãš await ã§ãã
以äžã®ã»ã¯ã·ã§ã³ã§ããã®ãã¬ãŒãºãããŒãããšã«èŠãŠãããŸã:
- éåæã³ãŒã
asyncãšawait- ã³ã«ãŒãã³
éåæã³ãŒã
éåæã³ãŒããšã¯ãèšèª ð¬ ãã³ãŒãã®ã©ããã®æç¹ã§ãã³ã³ãã¥ãŒã¿/ããã°ã©ã ð€ ã«ãã©ããå¥ã®ãšããã§çµãããŸã§ãå¥ã®äœãããåŸ ã€å¿ èŠããããšäŒããææ®µãæã£ãŠããããšããããšã§ãããã®ãå¥ã®äœããããé ããã¡ã€ã«ãð ãšåŒã¶ããšã«ããŸãããã
ãã®éãã³ã³ãã¥ãŒã¿ã¯ãé ããã¡ã€ã«ãð ãçµãããŸã§ãä»ã®äœæ¥ãé²ããããŸãã
ãã®åŸãã³ã³ãã¥ãŒã¿/ããã°ã©ã ð€ ã¯ããŸãåŸ ã€æ©äŒãæ¥ããšããããã®æç¹ã§æ±ããŠããäœæ¥ããã¹ãŠçµãããšãã«æ»ã£ãŠããŸãããããŠãåŸ ã£ãŠããã¿ã¹ã¯ã®ã©ãããçµãã£ãŠããªãã確èªããå¿ èŠãªåŠçãå®è¡ããŸãã
次ã«ãæåã«çµãã£ãã¿ã¹ã¯ (ããšãã°ãé ããã¡ã€ã«ãð) ãåããç¶ãã®åŠçãè¡ããŸãã
ãã®ãå¥ã®äœããåŸ ã€ãã¯ãéåžž I/O æäœãæãã(ããã»ããµã RAM ã®éåºŠã«æ¯ã¹ãŠ) çžå¯Ÿçã«ãé ããåŸ æ©ã䌎ããŸããäŸãã°æ¬¡ã®ãããªãã®ã§ã:
- ã¯ã©ã€ã¢ã³ããããããã¯ãŒã¯çµç±ã§ããŒã¿ãéãããŠããã®ãåŸ ã€
- ããã°ã©ã ãéä¿¡ããããŒã¿ãã¯ã©ã€ã¢ã³ãããããã¯ãŒã¯çµç±ã§åãåãã®ãåŸ ã€
- ãã£ã¹ã¯äžã®ãã¡ã€ã«å 容ãã·ã¹ãã ã«ããèªã¿åãããããã°ã©ã ã«æž¡ãããã®ãåŸ ã€
- ããã°ã©ã ãã·ã¹ãã ã«æž¡ããå 容ããã£ã¹ã¯ã«æžã蟌ãŸããã®ãåŸ ã€
- ãªã¢ãŒã API æäœ
- ããŒã¿ããŒã¹æäœã®å®äº
- ããŒã¿ããŒã¹ã¯ãšãªãçµæãè¿ãã®ãåŸ ã€
- ãªã©
å®è¡æéã®å€§åã I/O æäœã®åŸ ã¡æéã«è²»ããããããããããã¯ãI/O ããŠã³ãããªæäœãšåŒã°ããŸãã
ãéåæããšåŒã°ããã®ã¯ãã³ã³ãã¥ãŒã¿/ããã°ã©ã ããã®é ãã¿ã¹ã¯ãšãåæã(ã¿ã¹ã¯ãã¡ããã©çµããç¬éããäœãããã«åŸ ã€) ããå¿ èŠããªãããã§ããçµæãåãåã£ãŠåŠçãç¶ããããã«ãç©ºåŸ ã¡ããå¿ èŠããããŸããã
代ããã«ãéåæãã·ã¹ãã ã§ã¯ãã¿ã¹ã¯ãçµãã£ãããã³ã³ãã¥ãŒã¿/ããã°ã©ã ãåãããã£ãŠããäœæ¥ãçµãããŸã§ (æ°ãã€ã¯ãç§ã»ã©) å°ãåŸ ã¡ãçµæãåãåãã«æ»ã£ãŠåŠçãç¶ããããŸãã
ãéåæããšå¯Ÿã«ãªããåæãã¯ããã·ãŒã±ã³ã·ã£ã«ããšåŒã°ããããšããããŸããåŸ æ©ãå«ãŸããŠããŠããå¥ã®ã¿ã¹ã¯ã«åãæ¿ããåã«ã³ã³ãã¥ãŒã¿/ããã°ã©ã ãæé ãé çªã«å®è¡ããããã§ãã
䞊è¡åŠçãšãã³ããŒã¬ãŒ
äžã§èª¬æããéåæã³ãŒãã®èãæ¹ã¯ãã䞊è¡åŠçã ãšåŒã°ããããšããããŸãããã㯠ã䞊ååŠçã ãšã¯ç°ãªããŸãã
䞊è¡åŠç ã 䞊ååŠç ãããè€æ°ã®ããšãã ãããåæã«èµ·ãããããšã«é¢ä¿ããŸãã
ãã ãã䞊è¡åŠç 㚠䞊ååŠç ã®è©³çްã¯ããªãç°ãªããŸãã
éããèŠãããã«ããã³ããŒã¬ãŒã«é¢ããæ¬¡ã®ç©èªãæ³åããŠã¿ãŠãã ããã
䞊è¡ãã³ããŒã¬ãŒ
ããªãã¯å¥œããªäººãšãã¡ã¹ãããŒããè²·ãã«è¡ããåã®äººãã¡ã®æ³šæãã¬ãžä¿ãåããéãåã«äžŠã³ãŸããð
ãããŠããªãã®çªã«ãªãã奜ããªäººãšèªåã®ããã«ããšãŠã豪è¯ãªãã³ããŒã¬ãŒã2ã€æ³šæããŸããðð
ã¬ãžä¿ã¯ãããã³ã®æç人ã«ãããªãã®ãã³ããŒã¬ãŒãçšæãããã声ããããŸã (æç人ã¯ããŸåã®ã客ããã®åãäœã£ãŠããŸã)ã
æ¯æããããŸããðž
ã¬ãžä¿ã¯ããªãã«çªå·æãæž¡ããŸãã
åŸ ã£ãŠããéã奜ããªäººãšããŒãã«ã«ç§»åããŠåº§ãã(豪è¯ãªãã³ããŒã¬ãŒã¯æéããããã®ã§) ãã°ãã話ããŸãã
ããŒãã«ã§åŸ ã£ãŠããéã奜ããªäººãã©ãã ãçŽ æµã§ããããããŠãé ãè¯ãããçºããŠæéãéãããŸã âšðâšã
æã ã«ãŠã³ã¿ãŒã®è¡šç€ºãèŠãŠãèªåã®çªå·ã«ãªã£ãŠããã確èªããŸãã
ãããŠããªãã®çªã«ãªããŸããã«ãŠã³ã¿ãŒã«è¡ãããã³ããŒã¬ãŒãåãåããããŒãã«ã«æ»ããŸãã
ããªããšå¥œããªäººã¯ãã³ããŒã¬ãŒãé£ã¹ãŠã楜ããæéãéãããŸããâš
/// info | æ å ±
çŸããã€ã©ã¹ã㯠Ketrina Thompson ã«ãããã®ã§ããðš
///
ãã®ç©èªã§ãããªãèªèº«ãã³ã³ãã¥ãŒã¿/ããã°ã©ã ð€ ã ãšæ³åããŠã¿ãŠãã ããã
åã«ããéã¯ãäœããçç£çããªããšããããèªåã®çªãåŸ ã€ã ãã®ã¢ã€ãã«ç¶æ ðŽ ã§ãããã ãã¬ãžä¿ã¯æ³šæãåãã ã (äœãã¯ããªã) ãªã®ã§åã¯éãé²ã¿ãåé¡ãããŸããã
ããªãã®çªã«ãªããšãå®éã«ãçç£çããªäœæ¥ãããŸããã¡ãã¥ãŒãèŠãŠæ³šæã決ãã奜ããªäººã®åã確èªããæ¯æããæ£ããçŽå¹£/ã«ãŒããæž¡ããããæ£ããæ±ºæžãããããæ³šæå å®¹ãæ£ããããªã©ã確èªããŸãã
ãããããã³ããŒã¬ãŒã¯ãŸã åºæ¥äžãã£ãŠããªãã®ã§ãã¬ãžä¿ãšã®ããåãã¯ãäžæåæ¢ãâž ã«ãªããŸãããã³ããŒã¬ãŒãã§ãããŸã§åŸ 〠ð å¿ èŠãããããã§ãã
ãã ããçªå·æãæã£ãŠã«ãŠã³ã¿ãŒããé¢ãããŒãã«ã«åº§ãã°ã泚æã奜ããªäººã«åãæ¿ã ðãããã®äœæ¥ã⯠ð€ ã«åãçµããŸãã奜ããªäººãšãã¡ãã€ããšããããšãŠããçç£çãð€ ãªããšããŸãã§ããŸãã
ã¬ãžä¿ ð ãã«ãŠã³ã¿ãŒã®è¡šç€ºã«ããªãã®çªå·ãåºããŠããã³ããŒã¬ãŒãã§ããŸããããšç¥ãããŠããããªãã¯è¡šç€ºãåãæ¿ãã£ãç¬éã«é£ã³è·³ãããããŸãããèªåã®çªå·æããããä»ã®äººã«ãããããçªå·æãããã®ã§ããã³ããŒã¬ãŒãçãããããšã¯ãªããšç¥ã£ãŠããããã§ãã
ã ããã奜ããªäººã®è©±ãçµããã®ãåŸ ã¡ (çŸåšã®äœæ¥ ⯠/ åŠçäžã®ã¿ã¹ã¯ãå®äºã ð€)ã埮ç¬ãã§ããã³ããŒã¬ãŒåã£ãŠãããããšèšããŸã âžã
ããããã«ãŠã³ã¿ãŒãžè¡ã ðãããŸå®äºããåæã®ã¿ã¹ã¯ â¯ ã«æ»ã£ãŠããã³ããŒã¬ãŒãåãåãã瀌ãèšã£ãŠããŒãã«ã«æã£ãŠãããŸããããã§ã«ãŠã³ã¿ãŒãšã®ããåããšããã¹ããã/ã¿ã¹ã¯ã¯å®äº â¹ ã§ãããã®çµæãšããŠããã³ããŒã¬ãŒãé£ã¹ããð ⯠ãšããæ°ããã¿ã¹ã¯ãçãŸããŸãããå ã®ããã³ããŒã¬ãŒãåãåããã¿ã¹ã¯ã¯å®äº â¹ ããŠããŸãã
䞊åãã³ããŒã¬ãŒ
ä»åºŠã¯ããããã䞊è¡ãã³ããŒã¬ãŒãã§ã¯ãªãã䞊åãã³ããŒã¬ãŒãã ãšæ³åããŸãããã
ããªãã¯å¥œããªäººãšã䞊åããã¡ã¹ãããŒããè²·ãã«è¡ããŸãã
è€æ°ã®ã¬ãžä¿ (äŸãã° 8 人) ãåæã«æç人ã§ããããåã®äººãã¡ã®æ³šæãåããŠããŸãã
8 人ã®ã¬ãžä¿ã¯ãããããæ¬¡ã®æ³šæãåãåã«ããã«èª¿çã«åãããããããããªãã®åã®äººãã¡ã¯ã«ãŠã³ã¿ãŒãé¢ããããã³ããŒã¬ãŒãã§ããã®ãåŸ ã£ãŠããŸãã
ããããããªãã®çªã«ãªãã奜ããªäººãšèªåã®ããã«è±ªè¯ãªãã³ããŒã¬ãŒã 2 ã€æ³šæããŸãã
æ¯æããããŸã ðžã
ã¬ãžä¿ã¯ãããã³ã«åãããŸãã
çªå·æããªããããä»ã®èª°ãã«å ã«åãããªããããã«ãŠã³ã¿ãŒã®åã§ç«ã£ãŠåŸ ã¡ãŸã ðã
ããªããšå¥œããªäººã¯ã誰ã«ãå²ã蟌ãŸãããã³ããŒã¬ãŒãæ¥ããããåãåããããèŠåŒµã£ãŠããã®ã§ã奜ããªäººã«æ³šæãåããããŸãããð
ããã¯ãåæãçãªäœæ¥ã§ããã¬ãžä¿/æç人 ðšâð³ ãšãåæãããŠããŸããã¬ãžä¿/æç人 ðšâð³ ããã³ããŒã¬ãŒãäœãçµããŠææž¡ããã®ç¬éã«ãåŸ ã£ãŠ ð ãã®å Žã«ããªããã°ãªããŸãããããã§ãªããšä»ã®èª°ãã«åããããããããŸããã
é·ãæé ð ã«ãŠã³ã¿ãŒåã§åŸ ã£ãåŸãããããã¬ãžä¿/æç人 ðšâð³ ããã³ããŒã¬ãŒãæã£ãŠæ»ã£ãŠããŸãã
ãã³ããŒã¬ãŒãåãåãã奜ããªäººãšããŒãã«ã«è¡ããŸãã
é£ã¹ãŠããããŸãã§ããâ¹
ã»ãšãã©ã®æéãã«ãŠã³ã¿ãŒåã§åŸ 〠ð ã®ã«è²»ããããããããŸã話ãããããã¡ãã€ãããã§ããŸããã§ãããð
/// info | æ å ±
çŸããã€ã©ã¹ã㯠Ketrina Thompson ã«ãããã®ã§ããðš
///
ãã®ã䞊åãã³ããŒã¬ãŒãã®ã·ããªãªã§ã¯ãããªã㯠2 ã€ã®ããã»ããµ (ããªããšå¥œããªäºº) ãæã€ã³ã³ãã¥ãŒã¿/ããã°ã©ã ð€ ã§ãã©ã¡ããé·ãé ðãã«ãŠã³ã¿ãŒã§ã®åŸ æ©ãã«æ³šæ ⯠ãå°å¿µããŠããŸãã
ãã¡ã¹ãããŒãåºã«ã¯ 8 åã®ããã»ããµ (ã¬ãžä¿/æç人) ããããŸããäžæ¹ã䞊è¡ãã³ããŒã¬ãŒã®åºã«ã¯ (ã¬ãžä¿ 1ã人ãæç人 1 人ã®) 2 åãããªãã£ããããããŸããã
ããã§ããæçµçãªäœéšã¯æè¯ãšã¯èšããŸãããð
ããã¯ãã³ããŒã¬ãŒã«ããã䞊åçã®ç©èªã§ããð
ãããçŸå®çãªãäŸãšããŠãéè¡ãæ³åããŠã¿ãŠãã ããã
ã€ãæè¿ãŸã§ãã»ãšãã©ã®éè¡ã«ã¯è€æ°ã®çªå£ä¿ ðšâðŒðšâðŒðšâðŒðšâðŒ ãšé·ãè¡å ðððððððð ããããŸããã
åçªå£ä¿ããäžäººãã€ããã¹ãŠã®äœæ¥ãé çªã«è¡ããŸã ðšâðŒâ¯ã
ãããŠãé·æé ð è¡åã§åŸ ããªããã°é çªã倱ããŸãã
éè¡ã®çšäº ðŠ ã«ã奜ããªäºº ð ãé£ããŠè¡ããããšã¯æããªãã§ãããã
ãã³ããŒã¬ãŒã®ãŸãšã
ãã®ã奜ããªäººãšãã¡ã¹ãããŒããã®ã·ããªãªã§ã¯ãåŸ ã¡æé ð ãå€ãããã䞊è¡ã·ã¹ãã âžð⯠ãäœ¿ãæ¹ãã¯ããã«çã«ããªã£ãŠããŸãã
ããã¯ãã»ãšãã©ã® Web ã¢ããªã±ãŒã·ã§ã³ã«ãåœãŠã¯ãŸããŸãã
ãšãŠãå€ãã®ãŠãŒã¶ãŒãããŸããããµãŒãã¯åœŒãã®ããŸãéããªãåç·ãããªã¯ãšã¹ããå±ãã®ãåŸ ã¡ ðã
ãã®åŸãã¬ã¹ãã³ã¹ãæ»ã£ãŠããã®ããŸãåŸ ã¡ãŸã ðã
ãã®ãåŸ ã¡ãð ã¯ãã€ã¯ãç§åäœã§æž¬ãããŸããããã¹ãŠãåèšãããšãçµå±ããªãã®åŸ ã¡ã«ãªããŸãã
ã ãããããWeb API ã«ã¯éåæ âžð⯠ã³ãŒãã䜿ãã®ãçã«ããªã£ãŠããŸãã
ããããNodeJS ã人æ°ã«ããèŠå (NodeJS èªäœã¯äžŠåã§ã¯ãããŸãã) ã§ãããããã°ã©ãã³ã°èšèªãšããŠã® Go ã®åŒ·ã¿ã§ããããŸãã
ãããŠãããã FastAPI ã§åŸãããããã©ãŒãã³ã¹ã®æ°Žæºã§ãã
ããã«ãäžŠåæ§ãšéåææ§ãåæã«æŽ»çšã§ããããããã¹ããããå€ãã® NodeJS ãã¬ãŒã ã¯ãŒã¯ããé«ãæ§èœãçºæ®ããC ã«è¿ãã³ã³ãã€ã«èšèªã§ãã Go ãšåçã®æ§èœã«ãªããŸã (ãã¹ãŠ Starlette ã®ãããã§ã)ã
䞊è¡åŠçã¯äžŠååŠçããåªããŠããïŒ
ãããïŒããããã®è©±ã®æèšã§ã¯ãããŸããã
䞊è¡åŠçã¯äžŠååŠçãšã¯ç°ãªããŸãããããŠå€ãã®åŸ ã¡æéã䌎ãç¹å®ã®ã·ããªãªã§ã¯åªããŠããŸãããã®ãããäžè¬ã« Web ã¢ããªéçºã§ã¯äžŠååŠçããã¯ããã«é©ããŠããŸãããããããã¹ãŠã«å¯ŸããŠæè¯ãšããããã§ã¯ãããŸããã
ãã©ã³ã¹ãåãããã«ã次ã®çãç©èªãæ³åããŠãã ããã
倧ãããŠæ±ããå®¶ãæé€ããªããã°ãªããªãã
ã¯ããããã§ç©èªã¯å šéšã§ãã
ã©ãã«ãåŸ ã¡ ð ã¯ãªããå®¶ã®è€æ°ç®æã§å€§éã®äœæ¥ãããã ãã§ãã
ãã³ããŒã¬ãŒã®äŸã®ããã«é çªã決ããŠããŸããªãã³ã°ã次ã«ãããã³ããšé²ããŠãããã®ã§ãããäœããåŸ ã€ ð ããã§ã¯ãªããã²ãããæé€ããã ããªã®ã§ãé çªã¯äœã圱é¿ããŸããã
é çªã®æç¡ (äžŠè¡æ§ã®æç¡) ã«é¢ä¿ãªããçµäºãŸã§ã«åãæéãããããåãäœæ¥éãããªãããšã«ãªããŸãã
ããããã®å Žåã8 人ã®å ã¬ãžä¿/æç人/çŸæž æå¡ãé£ããŠããŠããããã (ããªããå ããŠ) å®¶ã®å¥ã ã®ãšãªã¢ãæé€ã§ããã°ã䞊å ã«äœæ¥ã§ããããæ©ãçµããããŸãã
ãã®ã·ããªãªã§ã¯ãåæž æå¡ (ããªããå«ã) ãããã»ããµã§ããããããããèªåã®åœ¹å²ãæãããŸãã
ãããŠå®è¡æéã®å€§å㯠(åŸ ã¡ã§ã¯ãªã) å®äœæ¥ãå ããã³ã³ãã¥ãŒã¿ã§ã®äœæ¥ã¯ CPU ã«ãã£ãŠè¡ãããŸãããããã®åé¡ã¯ãCPU ããŠã³ãããšåŒã°ããŸãã
CPU ããŠã³ããªæäœã®äžè¬çãªäŸã¯ãè€éãªæ°å€åŠçãå¿ èŠãªãã®ã§ãã
äŸãã°:
- ãªãŒãã£ãª ã ç»ååŠçã
- ã³ã³ãã¥ãŒã¿ããžã§ã³: ç»åã¯æ°çŸäžã®ãã¯ã»ã«ã§æ§æãããåãã¯ã»ã«ã«ã¯ 3 ã€ã®å€/è²ããããéåžžããããã®ãã¯ã»ã«äžã§åæã«äœããèšç®ããå¿ èŠããããŸãã
- æ©æ¢°åŠç¿: å€ãã®ãè¡åããããã¯ãã«ãã®ä¹ç®ãå¿ èŠã«ãªããŸãã巚倧ãªã¹ãã¬ããã·ãŒãã«æ°åãå ¥ã£ãŠããŠãããããåæã«ãã¹ãŠæãåãããããšãæ³åããŠãã ããã
- ãã£ãŒãã©ãŒãã³ã°: æ©æ¢°åŠç¿ã®ãµããã£ãŒã«ããªã®ã§åæ§ã§ããæãåãããæ°åã 1 ã€ã®ã¹ãã¬ããã·ãŒãã§ã¯ãªãèšå€§ãªéåã§ãããå€ãã®å Žåããããã®ã¢ãã«ãæ§ç¯/å©çšããããã®ç¹å¥ãªããã»ããµã䜿ããŸãã
䞊è¡åŠç + 䞊ååŠç: Web + æ©æ¢°åŠç¿
FastAPI ã§ã¯ãWeb éçºã§éåžžã«äžè¬çãªäžŠè¡åŠç (NodeJS ã®äž»ãªé åãšåã) ãæŽ»çšã§ããŸãã
åæã«ãæ©æ¢°åŠç¿ã·ã¹ãã ã®ãã㪠CPU ããŠã³ã ãªã¯ãŒã¯ããŒãã«å¯ŸããŠã䞊ååŠçããã«ãããã»ãã·ã³ã° (è€æ°ããã»ã¹ã®äžŠåå®è¡) ã®å©ç¹ã掻çšã§ããŸãã
ããã«ãPython ã ããŒã¿ãµã€ãšã³ã¹ãæ©æ¢°åŠç¿ãç¹ã«ãã£ãŒãã©ãŒãã³ã°ã®äž»èŠèšèªã§ãããšããäºå®ãçžãŸã£ãŠãFastAPI ã¯ããŒã¿ãµã€ãšã³ã¹/æ©æ¢°åŠç¿ã® Web API ãã¢ããªã±ãŒã·ã§ã³ (ã»ã倿°) ã«éåžžã«é©ããŠããŸãã
æ¬çªç°å¢ã§ãã®äžŠåæ§ãå®çŸããæ¹æ³ã¯ããããã€{.internal-link target=_blank} ã®ã»ã¯ã·ã§ã³ãåç §ããŠãã ããã
async ãš await
ã¢ãã³ãª Python ã«ã¯ãéåæã³ãŒãããšãŠãçŽæçã«å®çŸ©ããæ¹æ³ããããŸããããã«ãããéåžžã®ãã·ãŒã±ã³ã·ã£ã«ããªã³ãŒãã®ããã«æžããŠãé©åãªã¿ã€ãã³ã°ã§ãåŸ ã¡ããè¡ã£ãŠãããŸãã
çµæãè¿ãåã«åŸ ã¡ãå¿ èŠã§ããããã®æ°ãã Python æ©èœããµããŒãããŠããæäœãããå Žåãæ¬¡ã®ããã«æžããŸãã
burgers = await get_burgers(2)
ããã§ã®éµã¯ await ã§ããburgers ã«çµæãä¿åããåã«ãget_burgers(2) ãããã¹ãããšãçµããã®ã âž åŸ
〠ð ããã« Python ã«äŒããŸããããã«ãã Python ã¯ããã®éã« (å¥ã®ãªã¯ãšã¹ããåãåããªã©) ã»ãã®ããšã ð ⯠ã§ãããšåãããŸãã
await ãæ©èœããã«ã¯ããã®éåææ§ããµããŒããã颿°ã®å
éšã§ãªããã°ãªããŸããããã®ããã«ã¯ async def ã§å®£èšããŸã:
async def get_burgers(number: int):
# ãã³ããŒã¬ãŒãäœãããã«éåæã®åŠçãè¡ã
return burgers
...def ã®ä»£ããã«:
# ããã¯éåæã§ã¯ãªã
def get_sequential_burgers(number: int):
# ãã³ããŒã¬ãŒãäœãããã«ã·ãŒã±ã³ã·ã£ã«ãªåŠçãè¡ã
return burgers
async def ã䜿ããšãPython ã¯ãã®é¢æ°å
ã§ await åŒã«æ³šæãã颿°ã®å®è¡ããäžæåæ¢ãâž ããŠã»ãã®ããšããã«è¡ã ðãæ»ã£ãŠããããšãã§ãããšåãããŸãã
async def ãªé¢æ°ãåŒã¶ãšãã¯ãawaitãããªããã°ãªããŸããããããã£ãŠã次ã¯åããŸãã:
# åããŸãããget_burgers 㯠async def ã§å®çŸ©ãããŠããŸã
burgers = get_burgers(2)
ãã®ãããawait ã§åŒã¹ããšè¬³ã£ãŠããã©ã€ãã©ãªã䜿ã£ãŠããå Žåã¯ãããã䜿ã path operation 颿° ã async def ã§äœãå¿
èŠããããŸããäŸãã°:
@app.get('/burgers')
async def read_burgers():
burgers = await get_burgers(2)
return burgers
ããçºå±çãªæè¡è©³çް
await 㯠async def ã§å®çŸ©ããã颿°ã®å
éšã§ãã䜿ããªãããšã«æ°ã¥ãããããããŸããã
åæã«ãasync def ã§å®çŸ©ããã颿°ã¯ãawaitããããå¿
èŠããããŸããã€ãŸããasync def ãæã€é¢æ°ã¯ããã¯ã async def ã§å®çŸ©ããã颿°ã®å
éšããããåŒã¹ãŸããã
ã§ã¯ããã¯ããªãšåµã®è©±ã®ããã«ãæåã® async 颿°ã¯ã©ãåŒã¶ã®ã§ããããïŒ
FastAPI ã䜿ã£ãŠããå Žåã¯å¿é ãããŸããããã®ãæåã®ã颿°ã¯ path operation 颿° ã§ãFastAPI ãé©åã«å®è¡ããŠãããŸãã
ããããFastAPI ã䜿ããã« async / await ã䜿ãããå ŽåããããŸãã
èªåã§ async ã³ãŒããæžã
Starlette (FastAPI ã) 㯠AnyIO ã®äžã«æ§ç¯ãããŠãããæšæºã©ã€ãã©ãªã® asyncio ãš Trio ã®äž¡æ¹ã«å¯Ÿå¿ããŠããŸãã
ç¹ã«ãããªãèªèº«ã®ã³ãŒãå ã§ãããé«åºŠãªãã¿ãŒã³ãå¿ èŠãšããçºå±çãªäžŠè¡åŠçã®ãŠãŒã¹ã±ãŒã¹ã«å¯ŸããŠãAnyIO ãçŽæ¥äœ¿ããŸãã
仮㫠FastAPI ã䜿ã£ãŠããªããŠããAnyIO ã§ç¬èªã® async ã¢ããªã±ãŒã·ã§ã³ãæžãã°ãé«ãäºææ§ãšå©ç¹ (äŸ: æ§é åäžŠè¡æ§) ãåŸãããŸãã
ç§ã¯ AnyIO ã®äžã«èãå±€ãšããŠãåæ³šéãå°ãæ¹åããããè¯ãè£å®ãã€ã³ã©ã€ã³ãšã©ãŒãªã©ãåŸãããã®å¥ã©ã€ãã©ãªãäœããŸããããŸããçè§£ããŠèªåã§ async ã³ãŒããæžãã®ã«åœ¹ç«ã€ãã¬ã³ããªãŒãªã€ã³ãã/ãã¥ãŒããªã¢ã«ããããŸã: Asyncerãç¹ã«ãasync ã³ãŒããšéåžžã® (ããããã³ã°/åæ) ã³ãŒããçµã¿åãããå¿ èŠãããå Žåã«æçšã§ãã
éåæã³ãŒãã®ä»ã®åœ¢åŒ
async ãš await ã䜿ããã®ã¹ã¿ã€ã«ã¯ãèšèªãšããŠã¯æ¯èŒçæ°ãããã®ã§ãã
ããããããã«ããéåæã³ãŒãã®åãæ±ãã¯å€§å¹ ã«ç°¡åã«ãªããŸãã
åç (ã»ãŒåäž) ã®æ§æãæè¿ã® JavaScript (ãã©ãŠã¶ãš NodeJS) ã«ãå°å ¥ãããŸããã
ãã以åã¯ãéåæã³ãŒãã®æ±ãã¯ããªãè€éã§é£è§£ã§ããã
以åã® Python ã§ã¯ã¹ã¬ããã Gevent ã䜿ããŸããããã³ãŒãã®çè§£ã»ãããã°ã»æèãã¯ããã«é£ãããªããŸãã
以åã® NodeJS / ãã©ãŠã¶ JavaScript ã§ã¯ãã³ãŒã«ããã¯ãã䜿ã£ãŠããããã³ãŒã«ããã¯å°çããæããŸããã
ã³ã«ãŒãã³
ã³ã«ãŒãã³ã¯ãasync def 颿°ãè¿ããã®ãæããã¡ãã£ãšæŽèœãçšèªã§ããPython ã¯ããããéå§ã§ããŠãã€ãçµäºãã颿°ã®ãããªãã®ãšããŠæ±ããŸãããå
éšã« await ããããã³ã«å
éšçã«äžæåæ¢ âž ãããããããªããã®ãšããŠèªèããŸãã
async ãš await ãçšããéåæã³ãŒãã®æ©èœå
šäœã¯ããã°ãã°ãã³ã«ãŒãã³ã䜿ãããšèŠçŽãããŸãããã㯠Go ã®äž»èŠæ©èœãGoroutinesãã«çžåœããŸãã
ãŸãšã
äžã®ãã¬ãŒãºãããäžåºŠèŠãŠã¿ãŸããã:
ã¢ãã³ãª Python 㯠ãéåæã³ãŒãã ã ãã³ã«ãŒãã³ã ãšåŒã°ããä»çµã¿ã§ãµããŒãããŠãããæ§æã¯
asyncãšawaitã§ãã
ä»ãªããããæå³ãåããã¯ãã§ããâš
ããããã¹ãŠã (Starlette ãéããŠ) FastAPI ãæ¯ããå°è±¡çãªããã©ãŒãã³ã¹ãå®çŸããŠããŸãã
éåžžã«çºå±çãªæè¡ç詳现
/// warning | 泚æ
ããããèªã¿é£ã°ããŠã倧äžå€«ã§ãã
ãã㯠FastAPI ã®å éšåäœã«é¢ããããšãŠãæè¡çãªè©³çްã§ãã
(ã³ã«ãŒãã³ãã¹ã¬ãããããããã³ã°çã®) æè¡ç¥èããããFastAPI ã async def ãšéåžžã® def ãã©ãæ±ããã«èå³ãããå Žåã¯ãèªã¿é²ããŠãã ããã
///
Path operation 颿°
path operation 颿° ã async def ã§ã¯ãªãéåžžã® def ã§å®£èšããå Žåã(ãµãŒãããããã¯ããŠããŸããã) çŽæ¥åŒã³åºãããã®ã§ã¯ãªããå€éšã®ã¹ã¬ããããŒã«ã§å®è¡ããããããåŸ
æ©ããŸãã
äžèšãšã¯ç°ãªãåäœã®å¥ã®éåæãã¬ãŒã ã¯ãŒã¯ããæ¥ãŠãããã»ãã®ããããªããã©ãŒãã³ã¹åäž (çŽ 100 ããç§) ãçã£ãŠãèšç®ã®ã¿ã®äºçŽ°ãª path operation 颿° ãçŽ ã® def ã§å®çŸ©ããããšã«æ
£ããŠããå ŽåãFastAPI ã§ã¯å¹æããŸã£ããéã«ãªãç¹ã«æ³šæããŠãã ããããããã®å Žåãpath operation 颿° ãããããã³ã°ãª I/O ãè¡ãã³ãŒãã䜿ã£ãŠããªãéããasync def ã䜿ã£ãæ¹ãè¯ãã§ãã
ããã§ããã©ã¡ãã®ç¶æ³ã§ããFastAPI ã¯ããªãã以å䜿ã£ãŠãããã¬ãŒã ã¯ãŒã¯ããã (å°ãªããšãåçã«) é«éã§ãã{.internal-link target=_blank} å¯èœæ§ãé«ãã§ãã
äŸåé¢ä¿
äŸåé¢ä¿{.internal-link target=_blank} ã«ã€ããŠãåæ§ã§ããäŸåé¢ä¿ã async def ã§ã¯ãªãæšæºã® def 颿°ã§ããå Žåãå€éšã®ã¹ã¬ããããŒã«ã§å®è¡ãããŸãã
ãµãäŸåé¢ä¿
è€æ°ã®äŸåé¢ä¿ã ãµãäŸåé¢ä¿{.internal-link target=_blank} ã (颿°å®çŸ©ã®ãã©ã¡ãŒã¿ãšããŠ) çžäºã«èŠæ±ãããããŸãããã®äžéšã¯ async defãä»ã¯éåžžã® def ã§äœãããŠããŠãåäœããŸããéåžžã® def ã§äœããããã®ã¯ãawaitãããã代ããã«ãå€éšã¹ã¬ããããŒã«ããã¹ã¬ããäžã§åŒã³åºãããŸãã
ãã®ä»ã®ãŠãŒãã£ãªãã£é¢æ°
ããªããçŽæ¥åŒã³åºããŠãŒãã£ãªãã£é¢æ°ã¯ãéåžžã® def ã§ã async def ã§ãæ§ããŸãããFastAPI ã¯ãã®åŒã³åºãæ¹ã«åœ±é¿ãäžããŸããã
ããã¯ãFastAPI ãããªãã®ä»£ããã«åŒã³åºã颿° (ããªãã¡ path operation 颿° ãšäŸåé¢ä¿) ãšã¯å¯Ÿç §çã§ãã
ãŠãŒãã£ãªãã£é¢æ°ã def ã®éåžžé¢æ°ã§ããã°ã(ããªãã®ã³ãŒãã«æžãããšããã«) çŽæ¥åŒã³åºãããã¹ã¬ããããŒã«ã§ã¯å®è¡ãããŸããã颿°ã async def ã§äœãããŠããå Žåã¯ããã®é¢æ°ãåŒã¶ãšãã« await ãã¹ãã§ãã
ç¹°ãè¿ãã«ãªããŸããããããã¯éåžžã«æè¡çãªè©³çްã§ã該åœäºé ãæ€çŽ¢ããŠããã«ãã©ãçããå Žåã«ã¯åœ¹ç«ã€ã§ãããã
ãã以å€ã®å Žåã¯ãäžã®ã»ã¯ã·ã§ã³ã®ã¬ã€ãã©ã€ã³ã«åŸãã°ååã§ã: æ¥ãã§ããŸããïŒã