ã€ãã³ãã«ãŒãã®ä»çµã¿ â JavaScriptãã1人ã§äœåœ¹ãããªããç§å¯
JavaScriptã¯ãã·ã³ã°ã«ã¹ã¬ãããã£ãŠèãããã ãã©ããããªã®ã«ã©ãããŠè²ããªåŠçãåæã«ããªããã®ïŒ
ãã質åã ããJavaScriptã®ãšã³ãžã³ã¯ç¢ºãã«1æ¬ã®ç³žïŒã¹ã¬ããïŒããæã£ãŠããªããã ãã©ããã€ãã³ãã«ãŒãããšããä»çµã¿ã®ãããã§ããŸãã§åæã«åããŠããããã«èŠãããã ããã¬ã¹ãã©ã³ã§1人ã®ãŠã§ã€ã¿ãŒã泚æãåããŠãæçãã§ããããŒãã«ããé ã«é è³ããŠããã€ã¡ãŒãžã ãã
ã€ãã³ãã«ãŒãã£ãŠå ·äœçã«ã¯ã©ãããä»çµã¿ãªã®ïŒ
倧ãã3ã€ã®ç»å Žäººç©ããããããŸããã³ãŒã«ã¹ã¿ãã¯ãã¯ä»ãŸãã«å®è¡äžã®åŠçãç©ã¿äžããå Žæã次ã«ãã³ãŒã«ããã¯ãã¥ãŒãã¯setTimeoutãã¯ãªãã¯ã€ãã³ããªã©ãããšã§å®è¡ãããåŠçã䞊ã¶åŸ ã¡è¡åããããŠããã€ã¯ãã¿ã¹ã¯ãã¥ãŒãã¯Promiseã®thenãasync/awaitã®ç¶ããå ¥ãåªå ãã¥ãŒã ããã€ãã³ãã«ãŒãã¯ã³ãŒã«ã¹ã¿ãã¯ã空ã«ãªããã³ã«ããŸããã€ã¯ãã¿ã¹ã¯ãã¥ãŒãå šéšåŠçããŠããã®ããšã³ãŒã«ããã¯ãã¥ãŒãã1ã€åãåºãããšãããµã€ã¯ã«ãç¹°ãè¿ããŠãããã ã
ãã€ã¯ãã¿ã¹ã¯ã®ã»ããå ã«åŠçããããã ãïŒãããsetTimeout(fn, 0)ãšPromise.resolve().then(fn)ã ãšãã©ã£ã¡ãå ã«åãã®ïŒ
Promise.resolve().then(fn)ã®ã»ããå ã ããsetTimeoutã®ã³ãŒã«ããã¯ã¯ã³ãŒã«ããã¯ãã¥ãŒïŒãã¯ãã¿ã¹ã¯ãã¥ãŒïŒã«å ¥ããã©ãPromiseã®.thenã¯ãã€ã¯ãã¿ã¹ã¯ãã¥ãŒã«å ¥ããã€ãã³ãã«ãŒãã¯å¿ ããã€ã¯ãã¿ã¹ã¯ãå ã«å šéšæ¶åãããããsetTimeout(fn, 0)ã§ã0ããªç§åŸããšæå®ããŠããPromiseã®åŸåãã«ãªããã ã
ãªãã»ã©ïŒãã©ãŠã¶ãšNode.jsã ãšãã€ãã³ãã«ãŒãã£ãŠéãã®ïŒ
åºæ¬ã®èãæ¹ã¯åãã ãã©ãNode.jsã®ã»ããããå°ã现ãããã§ãŒãºã«åãããŠããããNode.jsã§ã¯libuvãšããã©ã€ãã©ãªãã€ãã³ãã«ãŒããåãããŠããŠãtimersïŒsetTimeout/setIntervalïŒâ I/Oã³ãŒã«ãã㯠â idle/prepare â pollïŒæ°ããI/Oã€ãã³ãã®ååŸïŒâ checkïŒsetImmediateïŒâ closeã³ãŒã«ããã¯ããšãã6ã€ã®ãã§ãŒãºãé çªã«åã£ãŠãããã ããã©ãŠã¶ã®ã»ãã¯ç»é¢æç»ïŒã¬ã³ããªã³ã°ïŒã®ã¿ã€ãã³ã°ãã«ãŒãã«çµã¿èŸŒãŸããŠããç¹ã倧ããªéãã ãã
Node.jsã®libuvã£ãŠäœãããŠããã®ïŒJavaScriptã¯ã·ã³ã°ã«ã¹ã¬ãããªã®ã«ããã¡ã€ã«èªã¿æžããšãã©ãããŠãã®ïŒ
ããããã€ã³ãã ããJavaScriptèªäœã¯ã·ã³ã°ã«ã¹ã¬ããã ãã©ãlibuvã¯å éšã«ã¹ã¬ããããŒã«ãæã£ãŠãããã ããã¡ã€ã«ã®èªã¿æžããDNS解決ã¿ãããªãã©ãããŠãæéããããããããã³ã°åŠçã¯è£åŽã®ã¹ã¬ããããŒã«ã«ä»»ããŠãçµãã£ããã³ãŒã«ããã¯ãã¥ãŒã«çµæãè¿ããã ããJavaScriptã®ã¡ã€ã³ã¹ã¬ããã¯æ¢ãŸããã«æ¬¡ã®åŠçã«é²ãããã ãã
async/awaitã䜿ãã°äžŠååŠçãã§ããã£ãŠæã£ãŠããã ãã©ãéãã®ïŒ
ããã¯ãããã誀解ã ããasync/awaitã¯ãããŸã§ãéåæåŠçãåæçãªèŠãç®ã§æžããæ§æç³ãã§ãã£ãŠã䞊åå®è¡ãå®çŸãããã®ãããªããã ãawaitãããšãã®é¢æ°ã®å®è¡ã¯äžæåæ¢ãããã©ãä»ã®ã¹ã¬ããã§åããããããªããæ¬åœã«è€æ°ã®APIãåæã«åŒã³ãããªãPromise.allã䜿ã£ãŠè€æ°ã®Promiseãåæã«éå§ããå¿ èŠãããããããã§ãCPUã®èšç®åŠçã䞊ååãããããããªããŠãI/OåŸ ã¡ãéãåãããŠããã ããªãã ã
ãžããŒïŒãããã€ãã³ãã«ãŒãã§å°ãããšã£ãŠããã®ïŒ
ããããããã©ã³ãšã³ãžãã¢ã§ãåŒã£ãããèœãšã穎ãããã€ã¯ãã¿ã¹ã¯ã®é£¢é€ïŒstarvationïŒãã ããããšãã°Promiseã®.thenã®äžã§ãŸãæ°ããPromiseã解決ããŠ.thenãç»é²ããããšããã®ãç¹°ãè¿ããšããã€ã¯ãã¿ã¹ã¯ãã¥ãŒãæ°žé ã«ç©ºã«ãªããªããã€ãã³ãã«ãŒãã¯ãã€ã¯ãã¿ã¹ã¯ãå šéšæ¶åãããŸã§ã³ãŒã«ããã¯ãã¥ãŒã«é²ããªããããsetTimeoutãç»é¢æç»ããã€ãŸã§ãå®è¡ããããããŒãžãããªãŒãºããŠããŸããã ã
ãã€ã¯ãã¿ã¹ã¯ãçµãããªããšæ¬¡ã«é²ããªãã£ãŠæããâŠïŒå¯Ÿçã¯ããã®ïŒ
ååž°çã«ãã€ã¯ãã¿ã¹ã¯ãçæãããã¿ãŒã³ãé¿ããã®ãåºæ¬ã ãã倧éã®ããŒã¿ãåŠçãããªããéäžã§setTimeoutãrequestAnimationFrameãæãã§ãã¯ãã¿ã¹ã¯ã«éãããã¯ããã¯ãããããNode.jsãªãsetImmediateã§checkãã§ãŒãºã«åãã®ãæå¹ã ããã€ãã³ãã«ãŒãã®ä»çµã¿ãçè§£ããŠãããšãããã©ãŒãã³ã¹ãã¥ãŒãã³ã°ããã°ã®åå ç¹å®ãæ Œæ®µã«æ¥œã«ãªãããããã²èŠããŠãããŠã»ãããã€ã³ãã ãã