28 KiB
䞊è¡åŠçãš async / await
path operation 颿°ã®ããã® async def ã«é¢ãã詳现ãšéåæ (asynchronous) ã³ãŒãã䞊è¡åŠç (Concurrency)ããããŠã䞊ååŠç (Parallelism) ã®èæ¯ã«ã€ããŠã
æ¥ãã§ããŸããïŒ
TL;DR:
次ã®ãããªãawait ã䜿çšããŠåŒã³åºãã¹ããµãŒãããŒãã£ã©ã€ãã©ãªã䜿çšããŠããå Žå:
results = await some_library()
以äžã®æ§ã« async def ã䜿çšããŠpath operation 颿°ã宣èšããŸãã
@app.get('/')
async def read_results():
results = await some_library()
return results
!!! note "åè"
async def ã䜿çšããŠäœæããã颿°ã®å
éšã§ãã await ã¯äœ¿çšã§ããŸããã
ããŒã¿ããŒã¹ãAPIããã¡ã€ã«ã·ã¹ãã ãªã©ãšéä¿¡ããawait ã®äœ¿çšããµããŒãããŠããªããµãŒãããŒãã£ã©ã€ãã©ãª (çŸåšã®ã»ãšãã©ã®ããŒã¿ããŒã¹ã©ã€ãã©ãªã«åœãŠã¯ãŸããŸã) ã䜿çšããŠããå Žåãæ¬¡ã®æ§ã«ãåã« def ã䜿çšããŠéåžžéã path operation 颿° ã宣èšããŠãã ãã:
@app.get('/')
def results():
results = some_library()
return results
ã¢ããªã±ãŒã·ã§ã³ã (ã©ãããããã) ä»ã®äœãšãéä¿¡ãããå¿çãåŸ
ã€å¿
èŠããªãå Žåã¯ãasync def ã䜿çšããŠäžããã
ããåãããªãå Žåã¯ãéåžžã® def ã䜿çšããŠäžããã
åè: path operation 颿°ã«å¿
èŠãªã ã def ãš async def ãæ··åšãããããããã«æé©ãªãªãã·ã§ã³ã䜿çšããŠå®çŸ©ã§ããŸããããã«å¿ããŠFastAPIã¯æ£ããåŠçãè¡ããŸãã
ãšã«ãããäžèšã®ãããã®å Žåã§ãFastAPIã¯éåæã§åäœããéåžžã«é«éã§ãã
ããããäžèšã®ã¹ãããã«åŸãããšã§ãããã©ãŒãã³ã¹ã®æé©åãè¡ããŸãã
æè¡è©³çް
çŸä»£çã®Pythonã¯ãéåæã³ãŒãããããã³ã«ãŒãã³ããšç§°ããããã®ãå©çšããŠãµããŒãããŠããŸãããã㯠async ãš await æ§æãçšããŸãã
次ã®ã»ã¯ã·ã§ã³ã§ããã¬ãŒãºå ã®ããŒããé ã«èŠãŠãããŸããã:
- éåæã³ãŒã
asyncãšawait- ã³ã«ãŒãã³
éåæã³ãŒã
éåæã³ãŒããšã¯ãèšèªð¬ãã³ãŒãå ã®ã©ããã§ãã³ã³ãã¥ãŒã¿/ããã°ã©ã ð€ã« ä»ã®äœã ãã©ããå¥ã®ç®æã§çµäºããã®ãåŸ ã€ããã«äŒããææ®µãæã£ãŠããããšãæå³ããŸããä»ã®äœã ã¯ãé ããã¡ã€ã«ðããšåŒã°ããŠãããšããŸããã.
ãããã£ãŠãã³ã³ãã¥ãŒã¿ã¯ãé ããã¡ã€ã«ðããçµäºãããŸã§ãä»ã®åŠçãã§ããŸãã
ã³ã³ãã¥ãŒã¿/ããã°ã©ã ð€ã¯åã³åŸ æ©ããæ©äŒããããšããããã®æç¹ã§è¡ã£ãŠãããã¹ãŠã®äœæ¥ãå®äºãããã³ã«æ»ã£ãŠããŸãããããŠãå¿ èŠãªåŠçãããªãããã³ã³ãã¥ãŒã¿/ããã°ã©ã ð€ãåŸ ã£ãŠããåŠçã®ã©ãããçµãã£ãŠãããã©ãã確èªããŸãã
次ã«ãããð€ãæåã®ã¿ã¹ã¯ (èŠããã«ãå çšã®ãé ããã¡ã€ã«ðã)ãçµããããŠããã®ã¿ã¹ã¯ã®çµæã䜿ãå¿ èŠãããåŠçãç¶ããŸãã
ãã®ãä»ã®äœããåŸ ã€ããšã¯ãé垞以äžã®æ§ãªãã®ãåŸ ã€ãã㪠(ããã»ããµãšRAMã¡ã¢ãªã®éåºŠã«æ¯ã¹ãŠ) çžå¯Ÿçã«ãé ããI/O æäœãæããŸã:
- ãããã¯ãŒã¯çµç±ã§ã¯ã©ã€ã¢ã³ãããéä¿¡ãããããŒã¿
- ãããã¯ãŒã¯çµç±ã§ã¯ã©ã€ã¢ã³ããåä¿¡ãããããã°ã©ã ããéä¿¡ãããããŒã¿
- ã·ã¹ãã ã«ãã£ãŠèªã¿åãããããã°ã©ã ã«æž¡ããããã£ã¹ã¯å ã®ãã¡ã€ã«å 容
- ããã°ã©ã ãã·ã¹ãã ã«æž¡ããŠããã£ã¹ã¯ã«æžã蟌ãå 容
- ãªã¢ãŒãAPIæäœ
- ããŒã¿ããŒã¹æäœã®å®äº
- ããŒã¿ããŒã¹ã¯ãšãªãçµæãè¿ãããš
- ãªã©ã
å®è¡æéã®ã»ãšãã©ãI/O æäœã®åŸ ã¡æéãå ããããããã®ãããªæäœããI/O ããŠã³ããæäœãšèšããŸãã
ã³ã³ãã¥ãŒã¿/ããã°ã©ã ããã®ãããªé ãã¿ã¹ã¯ãšãåæ (ã¿ã¹ã¯ã®çµæãååŸããŠäœæ¥ãç¶è¡ããããã«ãäœãããã«ãã¿ã¹ã¯ãå®äºããç¬éãæ£ç¢ºã«åŸ ã€)ãããå¿ èŠããªãããããéåæããšåŒã°ããŸãã
ãã®ä»£ããã«ããéåæãã·ã¹ãã ã§ããããšã«ããããã£ããçµäºãããšãã¿ã¹ã¯ã¯ãã³ã³ãã¥ãŒã¿/ããã°ã©ã ãæ¢ã«éå§ããåŠçããã¹ãŠå®äºããã®ãã»ãã®å°ã (æ°ãã€ã¯ãç§) åŸ ã£ãŠãçµæãåãåãã«æ»ã£ãŠããŸãããããŠãåŠçãç¶ç¶ããŸãã
ãåæãã®å Žå (ãéåæããšã¯ç°ãªã)ããã·ãŒã±ã³ã·ã£ã«ããšããçšèªããã䜿çšãããŸããããã¯ãã³ã³ãã¥ãŒã¿/ããã°ã©ã ããã¹ãŠã®ã¹ãããã (åŸ æ©ã䌎ãå Žåã§ãå¥ã®ã¿ã¹ã¯ã«åãæ¿ããããšãªã) é çªã«å®è¡ããããã§ãã
䞊è¡åŠçãšãã³ããŒã¬ãŒ
äžèšã®éåæã³ãŒãã®ã¢ã€ãã¢ã¯ã**ã䞊è¡åŠçã**ãšåŒã°ããããšããããŸãã **ã䞊ååŠçã**ãšã¯ç°ãªããŸãã
䞊è¡åŠçãšäžŠååŠçã¯ã©ã¡ãããå€ããå°ãªããåæã«çºçããããŸããŸãªããšãã«é¢é£ããŠããŸãã
ãã ãã䞊è¡åŠçãšäžŠååŠçã®è©³çްã¯ãŸã£ããç°ãªããŸãã
éãã確èªããã«ã¯ããã³ããŒã¬ãŒã«é¢ããæ¬¡ã®ç©èªãæ³åããŠã¿ãŠãã ãã:
䞊è¡ãã³ããŒã¬ãŒ
ãã¡ã¹ãããŒãðãé£ã¹ãããšã奜ããªäººðãšã¬ãžã«äžŠãã§ãããã¬ãžä¿ðãããªãã®åã«ãã人éã®æ³šæãåãã€ããŠããŸãã
ããããããªãã®çªã«ãªãã奜ããªäººðãšèªåã®ããã«ã2ã€ã®éåžžã«è±ªè¯ãªãã³ããŒã¬ãŒðãæ³šæããŸãã
æéãæ¯æããŸãðžã
ã¬ãžä¿ðã¯ãããã³ã®ç·ðšâð³ã«åãã£ãŠãããªãã®ãã³ããŒã¬ãŒðãæºåããªããã°ãªããªããšäŒããããã«äœãèšããŸãã (圌ã¯çŸåšãåã®ã客ããã®ååãæºåããŠããŸãã)ã
ã¬ãžä¿ðã¯ããªãã«çªå·æãæž¡ããŸãã
åŸ ã£ãŠããéã奜ããªäººðãšäžç·ã«ããŒãã«ãéžãã§åº§ãã奜ããªäººðãšé·ãé話ãããŸã (泚æãããã³ããŒã¬ãŒã¯éåžžã«è±ªè¯ã§ãæºåã«å°ãæéããããã®ã§âšðâš)ã
ãã³ããŒã¬ãŒðãåŸ ã¡ãªãã奜ããªäººðãšããŒãã«ã«åº§ã£ãŠããéãããªãã®å¥œããªäººããªããŠçŽ æŽãããããããããŠé ããããã ãšâšðâšæãæãããªããæéãè²»ããããšãã§ããŸãã
奜ããªäººðãšè©±ããªããåŸ ã£ãŠããéããšãã©ããã«ãŠã³ã¿ãŒã«è¡šç€ºãããŠããçªå·ããã§ãã¯ããŠãèªåã®çªãã©ããã確èªããŸãã
ãã®åŸãã€ãã«ããªãã®çªã«ãªããŸãããã«ãŠã³ã¿ãŒã«è¡ãããã³ããŒã¬ãŒðãæã«å ¥ããŠããŒãã«ã«æ»ããŸãã
ããªããšããªãã®å¥œããªäººðã¯ãã³ããŒã¬ãŒðãé£ã¹ãŠã楜ããæéãéãããŸãâšã
äžèšã®ã¹ããŒãªãŒã§ãããªããã³ã³ãã¥ãŒã¿/ããã°ã©ã ð€ã ãšæ³åããŠã¿ãŠãã ããã
åã«ããéãããªãã¯ã¢ã€ãã«ç¶æ ã§ãðŽãäœããçç£çããªããšãããããã èªåã®çªãåŸ ã£ãŠããŸããããããã¬ãžä¿ðã¯æ³šæãåãåãã ããªã®ã§ (ååã®æºåãããŠããããã§ã¯ãªã)ãåã¯é«éã§ãããããã£ãŠãäœãåé¡ãããŸããã
ãããããããªãã®çªã«ãªã£ãããå®ã«ãçç£çãªãäœæ¥ãè¡ããŸãð€ãã¡ãã¥ãŒã確èªããæ¬²ãããã®ã決ãã奜ããªäººðã®æ¬²ãããã®ãèããæéãæ¯æãðžãçŸéãŸãã¯ã«ãŒããæ£ããæž¡ããã確èªããæ£ããæž ç®ãããããšã確èªããæ³šæãæ£ããéã£ãŠããããªã©ã確èªããŸãã
ãããããã³ããŒã¬ãŒðããŸã ã§ããŠããªãã®ã§ããã³ããŒã¬ãŒã®æºåãã§ãããŸã§åŸ æ©ðããå¿ èŠããããããã¬ãžä¿ðãšã®äœæ¥ã¯ãäžæåæ¢âžãã«ãªããŸãã
ããããã«ãŠã³ã¿ãŒããé¢ããŠãçªå·æãæã£ãŠããŒãã«ã«åº§ã£ãŠãããšãã¯ã泚æã奜ããªäººðã«åãæ¿ããŠðããã®äžã§ãä»äºâ¯ð€ããè¡ãªããŸãããã®åŸã奜ããªäººðãšãã¡ãã€ããã®ãããªãéåžžã«ãçç£çãªð€ãããšãåã³è¡ããŸãã
次ã«ãã¬ãžä¿ðã¯ãããã³ããŒã¬ãŒã®æºåãã§ããŸããðããšèšã£ãŠãã«ãŠã³ã¿ãŒã®ãã£ã¹ãã¬ã€ã«çªå·ã衚瀺ããŸããã衚瀺çªå·ãããªãã®çªå·ã«å€ãã£ãŠããããã«çã£ãããã«é£ãã§è¡ããããªããšã¯ãããŸãããããªãã¯èªåã®çªå·æãæã£ãŠãã£ãŠãä»ã®äººãèªåã®çªå·æãããã®ã§ãããªãã®ãã³ããŒã¬ãŒðãçã人ãããªãããšã¯ç¥ã£ãŠããŸãã
ãªã®ã§ãããªãã¯å¥œããªäººðã話ãçµããã®ãåŸ ã£ãŠ (çŸåšã®ä»äºâ¯ / åŠçäžã®ã¿ã¹ã¯ãçµäºããŸãð€)ãåªãã埮ç¬ãã§ããã³ããŒã¬ãŒãè²°ã£ãŠããããšèšããŸãâžã
次ã«ãã«ãŠã³ã¿ãŒãžãããŸããå®äºããæåã®ã¿ã¹ã¯â¯ãžåããããã³ããŒã¬ãŒðãåãåããæè¬ã®æã衚ããŠãããŒãã«ã«æã£ãŠãããŸããããã§ãã«ãŠã³ã¿ãŒãšã®ããåãã®ã¹ããã/ã¿ã¹ã¯ãå®äºããŸããâ¹ãããã«ãããããã³ããŒã¬ãŒãé£ã¹ãðâ¯ããšããæ°ããã¿ã¹ã¯ãäœæãããŸããããããåã®ããã³ããŒã¬ãŒãååŸããããšããã¿ã¹ã¯ã¯çµäºããŸããâ¹ã
䞊åãã³ããŒã¬ãŒ
ããããã䞊è¡ãã³ããŒã¬ãŒãã§ã¯ãªããã䞊åãã³ããŒã¬ãŒãã§ãããšããŸãããã
ããªãã¯å¥œããªäººðãšäžŠåãã¡ã¹ãããŒãðãè²·ãããšããŠããŸãã
åã«äžŠãã§ããŸãããäœäººãã®æçäººå Œãã¬ãžä¿ (8人ãšããŸããã) ðšâð³ðšâð³ðšâð³ðšâð³ðšâð³ðšâð³ðšâð³ðšâð³ãããªãã®åã«ãã人éã®æ³šæãåãã€ããŠããŸãã
8人ã®ã¬ãžä¿ãããããèªåã§æ³šæãåãããåŠããæ¬¡ã®æ³šæãåããåã«ãã³ããŒã¬ãŒãæºåããã®ã§ãããªãã®åã®äººéã¯ã«ãŠã³ã¿ãŒãé¢ããã«ããã³ããŒã¬ãŒðãã§ããã®ãåŸ ã£ãŠããŸãðã
ããããããããããªãã®çªã«ãªãã奜ããªäººðãšèªåã®ããã«ã2ã€ã®éåžžã«è±ªè¯ãªãã³ããŒã¬ãŒðãæ³šæããŸãã
æéãæ¯æããŸãðžã
ã¬ãžä¿ã¯ãããã³ã«è¡ããŸãðšâð³ã
ããªãã¯ã«ãŠã³ã¿ãŒã®åã«ç«ã£ãŠåŸ ã¡ãŸãðãçªå·æããªãã®ã§èª°ãããªããããå ã«ãã³ããŒã¬ãŒðãåããªãããã«ããŸãã
ããªããšå¥œããªäººðã¯å¿ããã®ã§ã誰ãããªãã®åã«æ¥ãããŸããããããªãã®ãã³ããŒã¬ãŒãå°çãããšãðã«èª°ã«ãåãããšãèš±ããŸãããããªãã¯å¥œããªäººã«æ³šæãæããŸããðã
ããã¯ãåæãäœæ¥ã§ãããã¬ãžä¿/æç人ðšâð³ãšãåæãããŸããã¬ãžä¿/æç人ðšâð³ããã³ããŒã¬ãŒðã宿ãããŠããªãã«æž¡ããŸã§åŸ ã€ðå¿ èŠããããã¡ããã©ãã®å®æã®ç¬éã«ããã«ããå¿ èŠããããŸããããã§ãªããã°ãä»ã®èª°ãã«åããããããããŸããã
ãã®åŸãã«ãŠã³ã¿ãŒã®åã§é·ãæéåŸ ã£ãŠããðãã€ãã«ã¬ãžä¿/æç人ðšâð³ããã³ããŒã¬ãŒðãæž¡ãã«æ»ã£ãŠããŸãã
ãã³ããŒã¬ãŒðãåãã奜ããªäººðãšããŒãã«ã«è¡ããŸãã
ãã é£ã¹ãã ããããã§ãããŸãã§ããðâ¹ã
ã»ãšãã©ã®æéãã«ãŠã³ã¿ãŒã®åã§åŸ ã€ã®ã«è²»ããããŠããã®ã§ðãããŸã話ããããã¡ãã€ãããšã¯ãããŸããã§ããðã
ãã®äžŠåãã³ããŒã¬ãŒã®ã·ããªãªã§ã¯ãããªãã¯2ã€ã®ããã»ããµãåããã³ã³ãã¥ãŒã¿/ããã°ã©ã ð€ (ããªããšããªãã®å¥œããªäººð) ã§ãããäž¡æ¹ãšãåŸ æ©ðããŠããŠã圌ãã¯ãã«ãŠã³ã¿ãŒã§åŸ æ©ðãããããšã«å°å¿µããŠããŸãâ¯ã
ãã¡ã¹ãããŒãåºã«ã¯8ã€ã®ããã»ããµ (ã¬ãžä¿/æç人) ðšâð³ðšâð³ðšâð³ðšâð³ðšâð³ðšâð³ðšâð³ðšâð³ããããŸããäžæ¹ã䞊è¡ãã³ããŒã¬ãŒåºã«ã¯2人 (ã¬ãžä¿ãšæç人) ððšâð³ããããªãã£ããããããŸããã
ããããããã§ããæçµçãªäœéšã¯æé«ã§ã¯ãããŸããðã
ããã¯ããã³ããŒã¬ãŒðã®è©±ãšåçãªè©±ã«ãªããŸãã
ãããçŸå®çãªãäŸãšããŠãéè¡ãæ³åããŠã¿ãŠãã ããã
æè¿ãŸã§ãã»ãšãã©ã®éè¡ã¯è€æ°ã®çªå£ðšâðŒðšâðŒðšâðŒðšâðŒã«ãè¡åððððððððãã§ããŠããŸããã
ãã¹ãŠã®çªå£ã§ã次ã ãšãäžäººã®å®¢ãšãã¹ãŠã®äœæ¥ãè¡ããŸãðšâðŒâ¯.
ãã®äžãé·æéãåã«äžŠã°ãªããã°ãããŸããðãããããªããšãé çªãåã£ãŠããŸããã
éè¡ðŠã§ã®çšäºã«ããªãã®å¥œããªäººðãé£ããŠè¡ãããã¯ãªãã§ãããã
ãã³ããŒã¬ãŒã®ãŸãšã
ãã®ã奜ããªäººãšã®ãã¡ã¹ãããŒããã³ããŒã¬ãŒãã®ã·ããªãªã§ã¯ãåŸ æ©ðãå€ãããã䞊è¡ã·ã¹ãã âžðâ¯ã䜿çšããæ¹ãã¯ããã«çã«ããªã£ãŠããŸãã
ããã¯ãã»ãšãã©ã®Webã¢ããªã±ãŒã·ã§ã³ã«åœãŠã¯ãŸããŸãã
å€ãã®ãŠãŒã¶ãŒãããŸããããµãŒããŒã¯ãããŸã匷ããªãåç·ã§ã®ãªã¯ãšã¹ãã®éä¿¡ãåŸ æ©ðããŠããŸãã
ãããŠãã¬ã¹ãã³ã¹ãè¿ã£ãŠããã®ãããäžåºŠåŸ æ©ðããŸãã
ãã®ãåŸ æ©ðãã¯ãã€ã¯ãç§åäœã§ãããããã§ãããã¹ãŠåç®ãããšãæçµçã«ã¯ããªãåŸ æ©ããããšã«ãªããŸãã
ããããWeb APIãžã®éåæâžðâ¯ã³ãŒãã®å©çšãçã«ããªã£ãŠããçç±ã§ãã
ã»ãšãã©ã®æ¢åã®äººæ°ã®ããPythonãã¬ãŒã ã¯ãŒã¯ (FlaskãDjangoãå«ã) ã¯ãPythonã®æ°ããéåææ©èœãã§ããåã«äœæãããŸããããããã£ãŠããããããããã€ããæ¹æ³ã¯ã䞊åå®è¡ãšãæ°æ©èœã»ã©åŒ·åã§ã¯ãªãå€ã圢åŒã®éåæå®è¡ããµããŒãããŸãã
ããããWebSocketã®ãµããŒãã远å ããããã«ãéåæWeb Python (ASGI) ã®äž»ãªä»æ§ã¯Djangoã§éçºãããŸããã
ãã®ãããªéåææ§ãNodeJSã人æ°ã«ããçç±ã§ã (NodeJSã¯äžŠåã§ã¯ãããŸããã)ããããŠãããã°ã©ãã³ã°èšèªãšããŠã®Goã®åŒ·ã¿ã§ããããŸãã
ãããŠãããã¯FastAPIã§åŸãããããã©ãŒãã³ã¹ãšåãã¬ãã«ã§ãã
ãŸãã䞊ååŠçãšéåæåŠçãåæã«å®è¡ã§ããããããã¹ãæžã¿ã®ã»ãšãã©ã®NodeJSãã¬ãŒã ã¯ãŒã¯ãããé«ããGoãšåçã®ããã©ãŒãã³ã¹ãåŸãããŸããGoã¯ãCã«è¿ãã³ã³ãã€ã«èšèªã§ã (Starletteã«æè¬ããŸã)ã
䞊è¡ã¯äžŠåãããåªããŠããŸããïŒ
ããïŒããã¯ãã®è©±ã®æèšã§ã¯ãããŸããã
䞊è¡åŠçã¯äžŠååŠçãšã¯ç°ãªããŸããå€ãã®åŸ æ©ã䌎ãç¹å®ã®ã·ããªãªã«é©ããŠããŸãããã®ãããäžè¬ã«ãWebã¢ããªã±ãŒã·ã§ã³éçºã§ã¯äžŠååŠçãããã¯ããã«åªããŠããŸãããããããã¹ãŠã«å¯ŸããŠããè¯ããšããããã§ã¯ãããŸããã
ãªã®ã§ããã©ã³ã¹ããšãããã«ã次ã®ç©èªãæ³åããŠäžãã:
ããªãã¯å€§ãããŠæ±ããå®¶ãæé€ããå¿ èŠããããŸãã
ã¯ãã以äžã§ãã
åŸ æ©ðãããå®¶ã®äžã®è€æ°ã®å Žæã§ããããã®ä»äºãããã ãã§ãã
ããªãã¯ãã³ããŒã¬ãŒã®äŸã®ããã«ãæåã¯ãªãã³ã°ã«ãŒã ãæ¬¡ã«ãããã³ã®ããã«é çªã«ãã£ãŠããããšãã§ããŸãããäœããåŸ æ©ðããŠããããã§ã¯ãªãããã ã²ãããã«æé€ãããã ãã§ãé çªã¯äœã«ã圱é¿ããŸããã
é çªã®æç¡ã«é¢ä¿ãªã (䞊è¡ã«) åãæéãããããåãéã®äœæ¥ãè¡ãããããšã«ãªãã§ãããã
ãããããã®å Žåã8人ã®å ã¬ãžä¿/æç人/çŸåœ¹æž æå¡ðšâð³ðšâð³ðšâð³ðšâð³ðšâð³ðšâð³ðšâð³ðšâð³ãæé ã§ããŠããããã (ããã«ããªãã) ãå®¶ã®å¥ã ã®å Žæãæé€ã§ããã°ã远å ã®å©ããåããŠããã¹ãŠã®äœæ¥ã䞊åã«è¡ããã¯ããã«æ©ãçµäºã§ããã§ãããã
ãã®ã·ããªãªã§ã¯ãæž æå¡ (ããªããå«ã) ã®ãããããããã»ããµãšãªããããããã®åœ¹å²ãæãããŸãã
ãŸããå®è¡æéã®ã»ãšãã©ã¯ (åŸ æ©ã§ã¯ãªã) å®éã®äœæ¥ã«è²»ããããã³ã³ãã¥ãŒã¿ã§ã®äœæ¥ã¯CPUã«ãã£ãŠè¡ãããŸãããããã®åé¡ã¯ãCPUããŠã³ãããšèšããŸãã
CPUããŠã³ãæäœã®äžè¬çãªäŸã¯ãè€éãªæ°åŠåŠçãå¿ èŠãªãã®ã§ãã
äŸãã°:
- ãªãŒãã£ãª ã ç»ååŠçã
- ã³ã³ãã¥ãŒã¿ããžã§ã³: ç»åã¯æ°çŸäžã®ãã¯ã»ã«ã§æ§æãããåãã¯ã»ã«ã«ã¯3ã€ã®å€/è²ããããéåžžããããã®ãã¯ã»ã«ã§äœããåæã«èšç®ããå¿ èŠãããåŠçã
- æ©æ¢°åŠç¿: éåžžãå€ãã®ãè¡åããšããã¯ãã«ãã®ä¹ç®ãå¿ èŠã§ãã巚倧ãªã¹ãã¬ããã·ãŒãã«æ°åãå ¥ããŠããããåæã«å šéšæãåãããããšãèããŠã¿ãŠãã ããã
- ãã£ãŒãã©ãŒãã³ã°: ããã¯æ©æ¢°åŠç¿ã®ãµããã£ãŒã«ãã§ãããããåãããšãåœãŠã¯ãŸããŸããä¹ç®ããæ°åãããåäžã®ã¹ãã¬ããã·ãŒãã§ã¯ãªãããããã®èšå€§ãªéåã§ãå€ãã®å Žåããããã®ã¢ãã«ãæ§ç¯ããã³/ãŸãã¯äœ¿çšããããã«ç¹å¥ãªããã»ããµã䜿çšããŸãã
䞊è¡åŠç + 䞊ååŠç: 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 ã§åŒã³åºãããšãã§ããã©ã€ãã©ãªã䜿çšããŠããå Žåã¯ã次ã®ããã« async def ã䜿çšããŠãããã䜿çšããpath operation 颿°ãäœæããå¿
èŠããããŸã:
@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 ã䜿çšãããå Žåã¯ãå
¬åŒPythonããã¥ã¡ã³ããåç
§ããŠäžããã
éåæã³ãŒãã®ä»ã®åœ¢åŒ
async ãš await ã䜿çšããã¹ã¿ã€ã«ã¯ããã®èšèªã§ã¯æ¯èŒçæ°ãããã®ã§ãã
éåæã³ãŒãã®æäœãã¯ããã«ç°¡åã«ãªããŸãã
ç䟡㪠(ãŸãã¯ã»ãšãã©åäžã®) æ§æããæè¿ã®ããŒãžã§ã³ã®JavaScript (ãã©ãŠã¶ããã³NodeJS) ã«ãæè¿çµã¿èŸŒãŸããŸããã
ãããããã®åã¯ãéåæã³ãŒãã®åŠçã¯ããªãè€éã§é£è§£ã§ããã
以åã®ããŒãžã§ã³ã®Pythonã§ã¯ãã¹ã¬ãããGeventãå©çšã§ããŸãããããããã³ãŒãã¯çè§£ããããã¯ããããŠãèå¯ãã¯ããã«è€éã§ãã
以åã®ããŒãžã§ã³ã®NodeJS / ãã©ãŠã¶JavaScriptã§ã¯ããã³ãŒã«ããã¯ãã䜿çšããŠããŸãããããã¯ãã³ãŒã«ããã¯å°çã«ã€ãªãããŸãã
ã³ã«ãŒãã³
ã³ã«ãŒãã³ã¯ãasync def 颿°ã«ãã£ãŠè¿ããããã®ãæãéåžžã«æŽèœãçšèªã§ããããã¯ãéå§ã§ããŠããã€ãçµäºãã颿°ã®ãããªãã®ã§ããããå
éšã« await ããããšãã¯å
éšçã«äžæåæ¢âžãããããšããããã®ã ãšPythonã¯èªèããŠããŸãã
async ãš await ãçšããéåæã³ãŒãã䜿çšãããã¹ãŠã®æ©èœã¯ããã³ã«ãŒãã³ãã䜿çšãããã®ãšããŠäœåºŠããŸãšããããŠããŸããGoã®äž»èŠæ©èœã§ããããŽã«ãŒãã³ãã«çžåœããŸãã
ãŸãšã
äžè¿°ãããã¬ãŒãºãèŠãŠã¿ãŸããã:
çŸä»£çã®Pythonã¯ãéåæã³ãŒãããããã³ã«ãŒãã³ããšç§°ããããã®ãå©çšããŠãµããŒãããŠããŸããããã¯
asyncãšawaitæ§æãçšããŸãã
ä»ã§ã¯ããã®æå³ãããçè§£ã§ããã¯ãã§ããâš
(Starletteãä»ããŠ) FastAPIã«åãäžããŠãå°è±¡çãªããã©ãŒãã³ã¹ãå®çŸããŠãããã®ã¯ããããã¹ãŠã§ãã
éåžžã«çºå±çãªæè¡ç詳现
!!! warning "泚æ" æããã¹ãããããŠãè¯ãã§ãããã
ãã®éšåã¯**FastAPI**ã®ä»çµã¿ã«é¢ããéåžžã«æè¡çãªè©³çްã§ãã
ããªãã®æè¡ç¥è (ã³ã«ãŒãã³ãã¹ã¬ãããããããã³ã°ãªã©) ããããFastAPIã `async def` ãšéåžžã® `def` ãã©ã®ããã«åŠçãããç¥ãããå Žåã¯ãå
ã«é²ãã§ãã ããã
Path operation 颿°
path operation 颿°ã async def ã®ä»£ããã«éåžžã® def ã§å®£èšãããšã(ãµãŒããŒããããã¯ããã®ã§) çŽæ¥åŒã³åºã代ããã«å€éšã¹ã¬ããããŒã« (awaitããã) ã§å®è¡ãããŸãã
äžèšã®æ¹æ³ãšéã£ãæ¹æ³ã®å¥ã®éåæãã¬ãŒã ã¯ãŒã¯ããæ¥ãŠãããå°ããªããã©ãŒãã³ã¹åäž (çŽ100ããç§) ã®ããã«éåžžã® def ã䜿çšããŠäºçŽ°ãªæŒç®ã®ã¿è¡ã path operation 颿° ãå®çŸ©ããã®ã«æ
£ããŠããå Žåã¯ãFastAPIã§ã¯ãŸã£ããéã®å¹æã«ãªãããšã«æ³šæããŠãã ããããã®ãããªå Žåãpath operation 颿° ãããããã³ã°I/Oãå®è¡ããªãã®ã§ããã°ãasync def ã®äœ¿çšããå§ãããŸãã
ããã§ããã©ã¡ãã®ç¶æ³ã§ããFastAPIãéå»ã®ãã¬ãŒã ã¯ãŒã¯ããã (ãŸãã¯ããã«å¹æµããã»ã©) é«éã«ãªã{.internal-link target=_blank}å¯èœæ§ããããŸãã
äŸåé¢ä¿
äŸåé¢ä¿ã«ã€ããŠãåæ§ã§ããäŸåé¢ä¿ã async def ã§ã¯ãªãæšæºã® def 颿°ã§ããå Žåãå€éšã¹ã¬ããããŒã«ã§å®è¡ãããŸãã
ãµãäŸåé¢ä¿
(颿°å®çŸ©ã®ãã©ã¡ãŒã¿ãŒãšããŠ) çžäºã«å¿
èŠãªè€æ°ã®äŸåé¢ä¿ãšãµãäŸåé¢ä¿ãèšå®ã§ããŸããäžéšã¯ async def ã§äœæãããä»ã®äžéšã¯éåžžã® def ã§äœæãããŸããããã§ãåäœããéåžžã® defã§äœæããããã®ã¯ããawaitãããã代ããã« (ã¹ã¬ããããŒã«ãã) å€éšã¹ã¬ããã§åŒã³åºãããŸãã
ãã®ä»ã®ãŠãŒãã£ãªãã£é¢æ°
ããªããçŽæ¥åŒã³åºããŠãŒãã£ãªãã£é¢æ°ã¯éåžžã® def ãŸã㯠async def ã§äœæã§ããFastAPIã¯åŒã³åºãæ¹æ³ã«åœ±é¿ãäžããŸããã
ããã¯ãFastAPIãåŒã³åºã颿°ãšå¯Ÿç §çã§ã: path operation 颿°ãšäŸåé¢ä¿ã
ãŠãŒãã£ãªãã£é¢æ°ã def ã䜿çšããéåžžã®é¢æ°ã§ããå Žåãã¹ã¬ããããŒã«ã§ã¯ãªãçŽæ¥ (ã³ãŒãã§èšè¿°ãããšããã«) åŒã³åºãããŸãã颿°ã async def ã䜿çšããŠäœæãããŠããå Žåã¯ãåŒã³åºãéã« await ããå¿
èŠããããŸãã
ç¹°ãè¿ãã«ãªããŸããããããã¯éåžžã«æè¡çãªè©³çްã§ãããæ€çŽ¢ããŠèŸ¿ãçããå Žåã¯åœ¹ç«ã€ã§ãããã
ãã以å€ã®å Žåã¯ãäžèšã®ã»ã¯ã·ã§ã³ã®ã¬ã€ãã©ã€ã³ã§åé¡ãªãã¯ãã§ã: æ¥ãã§ããŸããïŒã