ãããªãã§ãããnæåã©ã ããã¼ããåµåããã¾ããããã§ããã
ã§ããã®ä¸ã«ãã @mametter ããå·çã®è¨äºããã³ã«ã¼ãã³ãã¨ã¯ä½ã ã£ãã®ãï¼ãã«åã¯ãã£ã¤ãé¢ãã£ã¦ãã¾ããã
å¾è¿°ãã¾ãããåã¨å½¼ã¨ã®ãªã³ã©ã¤ã³ã§ã®ããåãã®ä¸ã§è¨äºãæ¸ãå§ããããæ¹éãæ±ºã¾ã£ã¦ãã£ãæãã§ãã
ãªã®ã§ãåºçãè¨å¿µãã¦ãã®ã¸ãã®çµç·¯ãæ¯ãè¿ããã¾ãåãªãã®ææ³ãã¾ã¨ããããã¨æãã¾ãã
â¦â¦ã¨æã£ããã§ãããæ¹ãã¦ããã¨ãã®ãã°ãè¦è¿ãã¦ããã§ããã¢ãã»ã©è¨å¤§ãªéã«ãªã£ã¦ãã¦ãã¨ã¦ãå
¨é¨æ¯ãè¿ãã®ã¯ç¡çã ã¨æãã¾ããã
ãªã®ã§ãã£ããã¨ã
å½è©²ã®è¨äºã¨ä¸ç·ã«èªã¾ãããã¨ãæ³å®ãã¦ãã¾ãã®ã§ããã®è¨äºã§èªããã¦ãããã¨ã®èª¬æã¯ããç¨åº¦çãã¦ãã¾ãã
æ°æéåã« @mametter ãããè稿ãå
¬éâããã®ã§ããã¡ããèªãã§ããã¦ãæ§ãã¾ããï¼ã§ããã°è²·ã£ã¦ã»ãããã©ï¼ã
ç®æ¬¡ï¼
çµç·¯
ãã£ãã
å»ã2018å¹´11æ17æ¥ãä»äºã§Pythonã³ã¼ããæ¸ãã¦ããåããã¤ãasyncioããã±ã¼ã¸å¨ãã§ã³ã¼ããä¸æãæ¸ããªãã¢ã¤ã¢ã¤ãå¤ã«ãªãã¨ãªãæç´ãã¾ããã
ãã®ä¸ã«ãasync/await ã§è¨è¿°ããããã®ããã³ã«ã¼ãã³ã*1 ã¨å¼ãã§ãããããããªãããããããã¨ãã話ãã¡ããã£ã¨å
¥ããã®ã§ãã
ç¿æ¥ã®11æ18æ¥ãåã®æç´ããã¢ã¤ã·ã¤åããææã«æãåã£ã @mametter ãããæããTwitterã§ã¶ã£ã±ãã¦ãç¡äºçjâ¦â¦ããºãã¾ãã
å¤ãããæãã§çãçãä¸ãåã @mametter ãããPythonã³ã«ã¼ãã³ã«æãåã£ãéåæã¯ãã£ããä½ãªã®ããæ¢ãé·ãæ
ãã¹ã¿ã¼ããã¾ãã
ã³ã«ã¼ãã³ã¨ã¯ä½ããæ¢ãæ
å¤ãããæãã«çâ¦â¦çãä¸ãã£ã¦ããããªããæåã«åãã®éã§å§ã¾ã£ãã®ã¯ãã³ã«ã¼ãã³ãä¸çªæåã«æ´»åã«ã¦èãããConwayã®1968å¹´ã®è«æã®èªã¿ä¼ã§ããã
ãããã23æ¥ã¾ã§ã®5æ¥éãã¨ã«ããè²ããªç©ã調ã¹ã¾ããã¾ãããæãã¤ãéãåæããã¨ã
- Conwayã®è«æ
- é対称ã³ã«ã¼ãã³ï¼ã»ãã³ã«ã¼ãã³ï¼ã«é¢ããDahlãã®1972å¹´ã®æç®
- de Moura and Ierusalimschy, "Revisiting Coroutines", 2004
- ã³ã«ã¼ãã³ã«ã¤ãã¦é常ã«ããã¾ã¨ã¾ã£ã¦ãããµã¼ãã¤è«æã§ãªã¹ã¹ã¡ã2000年代ã¾ã§ã®ã³ã«ã¼ãã³ãã©ããããã®ã ã£ããããã¡ãã¨ç¥ããããã°ãã®è«æãèªãã®ãè¯ãã¨æãã¾ãã
- ã¸ã§ãã¬ã¼ã¿ãæåã«ææ¡ããï¼ CLU Icon ãªãè¨èªã® Technical Report
- Pythonã®PEP2ã¤ï¼PEP342ãPEP492ï¼ããã®ä»KotlinãJavaScriptãC#ãC++ ã®ã³ã«ã¼ãã³é¢é£ã®RFP
- åè¨èªã§ã®ã³ã«ã¼ãã³ã®ç¨æ³ã解説ãã¦ããããã°ï¼è±èªãæ¥æ¬èªï¼ã Slideshare/SpeakerDeck ãããã
ãã®ä»ããããã
ããã¤ããèªã¿ãªãããã³ã«ã¼ãã³ã®å®ç¾©ã¨ãã®å¤é·ã®æ§åã«é¢ãã¦ããã§ããªãããã§ããªãã¨2人ã§å»¶ã
è°è«ãã¦ãã¾ããã
åæã«ãPythonã³ã«ã¼ãã³ã使ã£ã¦å¯¾ç§°ã³ã«ã¼ãã³ãåç¾ãã¦ã¿ããããã¦ãã¾ãããï¼ãã®çµæã¯çç¥ããã®ãã¡ç´¹ä»ãããããï¼
ãããªæãã§ãèªåãã¡ããªãã¨ãªãããããã³ã«ã¼ãã³ã ãã¨æã£ã¦ãããã®ããé©å®äºå®ã¨ç
§ããåããã¦ä¿®æ£ãæ´æ°ããããã¯è£å¼·ãã¦ãã使¥ã§ããã
70年代以åã®è«æãçãæéã«ããããèªãã ã®ãåãã¦ã§ãèªåãã¡ããã¦ãããã¨ãããææãã2人ã®éã§ãèå¤å¦ãã¨å¼ã¶ããã«ãªãã®ã§ãããå®éãèå¤å¦ã¨ããã®ã¯ããããå¦åãªãã ãããªã¨æã£ã次第ã
å·çãå§ã¾ã
19æ¥ã«å ¥ã£ã¦ãè£å´ã§å»¶ã ã¨è°è«ãã¦ããå 容ãåæ ãã¦ã @mametter ãããä»åã®è¨äºã®è稿ã«å½ãããã®ãæ¸ãå§ãã¾ãã  å½åã¯èªåã®ããã°ã«æ¸ãããã®ãã®ã§ããã£ã¨ç°¡ç´ ã ã£ããããã¤ã¼ãã ã¨æ¸ããããªã @mametter ããã®ãã¸ã·ã§ã³ãã¼ã¯ã¨ãããææè¡¨æã¨ãããããããããªã®ãã®ã§ããªã®ã§ @mametter ããã®ä¸»å¼µãè²æ¿ãæ®ã£ã¦ãã¾ããã
23æ¥é ãå¢ã«ä¸æ¦ãã®å·çã®æã¯æ¢ã¾ãã2人ã®éã§å¤å°è©±é¡ã«ãªã£ãããPPL*2ã§ãªã«ãã®å½¢ã§çºè¡¨ããããï¼ ãªã©ã¨ããæ¤è¨ããããã¯ãã¦ãããã®ã®ãç¹æ®µã®é²æã¯ãªããã®ã¾ã¾ãã°ããè¨äºã¯æ¾ç½®ããã¾ãã
 ããã¦åºçã¸
å¹´ãæãã¦2019å¹´ã®1æä¸æ¬ã@mametter ãããæ¸ãæºãã¦ãã£ãè稿ãã©ã ããã¼ã社é·ã® @golden_lucky ããã«è¦ããã¨ãã好è©ãå¾ãããã§ã@golden_lucky ããã以åããæ§æ³ãã¦ããéèªã«è¼ããæ¹åã§è©±ãé²ãã ããã§ãï¼ãã®ã¸ãã¯åã¯ç´æ¥ä¼è©±ã«ç«ã¡å ¥ã£ã¦ãªãã®ã§ããããªãï¼ãããã§è¨äºã®å·çãåéããã¾ãã
ã§ãåéæ©ã
åã主張ãããã¨ã¯ãè¨äºã®ä¸ã§ãä½ãã³ã«ã¼ãã³ãï¼ã³ã«ã¼ãã³ã§ãªãããã¨ããæå®ãé¿ããæ¹ããããã¨ãããã¨ã§ããã
ä¸è¿°ã®éãå
ã
㯠@mametter ããã®ãã¸ã·ã§ã³ãã¼ã¯ã ã£ãã®ã§å½ç¶ãã®ã¸ã㯠@mametter ãããªãã®æè¦ãå«ã¾ãã¦ããã®ã§ããããããçµè«ã¨ãã¦æã£ã¦ããããããããåãã調ã¹ãäºå®ã«åºã¥ãã¦ãã³ã«ã¼ãã³ã®å®ç¾©ãæºããã§ããï¼å¤é·ãã¦ãããã¨ãããã¨ã ããè¿°ã¹ããã以ä¸ã®å¤æã¯èªè
ã«å§ããã»ããããã¨èãã¾ããã Â
çµæã¨ãã¦è¨äºãããããæ¹åã«è»éä¿®æ£ãããããå®éãããããã¨ã§ããããªç«å ´ã®äººããã¥ã¼ãã©ã«ã«èªããå
容ã«ãªããè¨äºã®ä¾¡å¤ã¯ä¸ãã£ãã®ã§ã¯ãªããã¨å人çã«ã¯æã£ã¦ãã¾ãã
ææ
ããããã¯ãå®å ¨ã«åå人ã®éæã§ãã
ä»åè²ã è¦ã¦ã¾ãæãããã¨ã¯ãæè¿ã®è¨èªã¯ä¸¦åã»ä¸¦è¡ã«ã¾ã¤ããæ¦å¿µããã£ã¡ãã«ãªã£ã¦ããã¨ãããã¨ã§ãããã ãã¡ã¤ãã¼ãã³ã«ã¼ãã³ã軽éã¹ã¬ãããfuture / promise ãããããã¡ãæ··ãã«ãªã£ã¦ã§ãã¦ããããã«æãã¾ãã å®éã®ã¨ããããã®ã¸ããå ¨é¨åºå¥ã§ãã人ãã©ãã ããããã§ãããï¼
1980å¹´æã®ã³ã«ã¼ãã³ã®å®ç¾© 㨠Pythonã³ã«ã¼ãã³
ã¨ãããã¨ã§ãè¨äºã§ã¯æçµçã«ããããã³ã«ã¼ãã³ã ãã¨ããæå®ã¯é¿ããå½¢ã«ãªãã¾ããã ãã ã è¨äºã«ã¯è¼ãããã¦ããªãã®ã§ãããå®ã¯ Marlinããã³ã«ã¼ãã³ãæºããã¹ãåºç¤çæ§è³ªï¼fundamental characteristicsï¼ãã¨ãããã®ãæ¸ãã¦ãã¾ã ï¼Marlinâ80ï¼ã ãããããã
the values of data local to a coroutine persist between successive occasions on which enter it (that is, between successive calls)
ï¼ã³ã«ã¼ãã³å ã«ãã¼ã«ã«ã«åå¨ããå¤ã¯é£ç¶ãã âcallâ ã®éã§ä¿æãããï¼the execution of a coroutine is suspended as control leaves it, only to carry on where it left off when control re-enters the coroutine at some later stage.
ï¼ã³ã«ã¼ãã³ã®å®è¡ã¯å¶å¾¡ãé¢ããã忢ãããã®å¾ã®ã©ããã§ã³ã«ã¼ãã³ã«åå ¥ããã¨ãã«å¶å¾¡ã®é¢ããç®æããåéããï¼
ã«ãã³å ã¯åãä»é©å½ã«è¨³ãã¾ãããæãããªèª¤è¨³ã§ãªããã°å¾®å¦ãªã¨ããã¯è¦éãã¦ã Â
ãããè¨äºã«ä½¿ãããªãã£ãã®ã¯ããã®å®ç¾©ãã¾ãå¾®å¦ãªåé¡ãåãã§ããããã§ãã  ã©ããã¸ãã®è§£éãã¨ãã㨠âcallâ ã§ããç´ç²ã«èããã°ã³ã«ã¼ãã³éã®å¼ã³åºãï¼è¢«å¼ã³åºãã®ãã¨ã§ãããã ã¤ã¾ããã³ã«ã¼ãã³éã®éåæãªå¼ã³åºãããããã¨ãåæãªãã§ãã
ã¨ããããããã«Pythonã³ã«ã¼ãã³ãæã£ã¦ããã¨ãè§£éãã¨ã¦ãããããããªãã¾ãã
Pythonã³ã«ã¼ãã³ã£ã¦ãä»ã®ã³ã«ã¼ãã³ã¸ã®å¼ã³åºãã§éåæçãªä¸æãããããããªããã§ãããã
å¼ã³åºãã§éåæçãªä¸æãããã®ã¯ãå¼ã³åºãå
ã®ã³ã«ã¼ãã³ããããã¤ãå¼ã³åºãããã«å
ã®ã³ã«ã¼ãã³ãããã®å
ãâ¦â¦ãsleepããã¨ãã ããªãã§ããã
å¼ã³åºãï¼ä¸æã®åå³ã§ã¯ãªããã§ãã
ã§ããMarlinããããèããã¨ãã«ãã£ãã®ã¯ã対称ã³ã«ã¼ãã³ã¨é対称ã³ã«ã¼ãã³ã ãã§ããã ãã®2ã¤ã¯ä»ã®ã³ã«ã¼ãã³ãå¼ã³åºããã¨ã§éåæçãªä¸æãããä»çµã¿ã§ãå¼ã³åºãï¼ä¸æ ãªãã§ãã ã ããPythonã³ã«ã¼ãã³ã¯ãã®Marlinã®å®ç¾©ããã®ã¾ã¾å½ã¦ã¯ã¾ããããããªãã§ãã
ã¦ããPythonã³ã«ã¼ãã³ã£ã¦ã¶ã£ã¡ããã³ã«ã¼ãã³ã¨ãããããä»çµã¿ã¨ãã¦ã¯ã¹ã¬ããã«è¿ããã§ãããã
sleepã§å¯ã¦ãå¯ã¦ãéã¯ä¸ç·ã«åãã¦ãä»ã®ã¹ã¬ããã®ã©ããã«å¶å¾¡ãç§»ããsleepãè§£ããã°ã¹ã±ã¸ã¥ã¼ã©ã«ãã£ã¦ãã®ãã¡å¶å¾¡ãããã£ã¦å¦çãåéããã
ãããã¹ã¬ãããªãã§ããã
ããã«futureã®ä»çµã¿ãè¶³ãããã®ãPythonã³ã«ã¼ãã³ã®æ£ä½ã ãªãã¨ã
ã§ã¯Pythonã³ã«ã¼ãã³ã¯ã³ã«ã¼ãã³ã§ã¯ãªãã®ã
ãã ãããæ³å®ãç½®ããã¨ã§ãæ§æ¥ã®ã³ã«ã¼ãã³ã使ã£ãã¢ãã«ã¨èããããªãããªããã§ãã
ããã¯ãã¹ã±ã¸ã¥ã¼ã©ï¼Pythonã³ã«ã¼ãã³ã§ããã¤ãã³ãã«ã¼ãï¼ãç¹å¥ãªã³ã«ã¼ãã³ã¨èãããã¨ã§ãã
ãªã®ã§Pythonã³ã«ã¼ãã³ã®ã³ã³ãã¯ã¹ãã¹ã¤ããï¼æ¢ãã¦ã¹ã¬ããç¨èªã使ãï¼ã¯ãã¤ãã³ãã«ã¼ããã³ã«ã¼ãã³ãå¼ã³åºããã¨ã§ãã®ã³ã«ã¼ãã³ãå¦çãåéããã
sleepãããã¨ã§ã¤ãã³ãã«ã¼ãã«å¦çãæ»ãã
ã¤ãã³ãã«ã¼ããresumeãã¦ãã³ã«ã¼ãã³ãsleepã®ã¿ã¤ãã³ã°ã§yieldããé対称ã³ã«ã¼ãã³ã£ã¦ãã¨ã§ãã
ããã¯ãDahl et al. ã大æã«æ¸ãã¦ããææ³ã§ãã¾ããCrystalã®ãã¡ã¤ãã¼ãããããã¢ãã«ãæ¡ç¨ãã¦ãã¯ãã
ï¼åãä»ã®è¨èªã調ã¹ãä¸ã§ãPythonã³ã«ã¼ãã³ã«ä¸çªä¼¼ã¦ããªã¨æã£ãã®ã¯Crystalã®ãã¡ã¤ãã¼ã§ãããï¼
ãã®ã¢ãã«ãåæã«ãã¤ãã³ãã«ã¼ãï¼ã¹ã±ã¸ã¥ã¼ã©ã«ããã³ã³ãã¯ã¹ãã¹ã¤ãããå ã®Marlinã®å®ç¾©ã§è¨ãâcallâã¨ã¿ãªãã¦ããããã¨ããç¹ã§ å㨠@mametter ããã§è§£éãåããã¦ãæçµçã«ãã®å®ç¾©ã¯ä½¿ããªãã¨ãã話ã«ãªã£ãã®ã§ãã
çµå±ä½ãããããã®ã
éå»ã®è«æãä»ã®è¨èªã®ä»æ§ã調ã¹ã¾ãã£ã¦è²ã
èãã¾ããããçµå±Pythonã³ã«ã¼ãã³ã£ã¦ãå人çã«ã¯ãã¾ãã³ã«ã¼ãã³ã¨ã¯å¼ã³ãããªããã§ããããã£ã±ãã軽éã¹ã¬ããã¨å¼ã³ããä½ãã§ãã
ãããæªãã¨ããããã§ã¯ãªããã§ããããã ã³ã«ã¼ãã³ã¨ãã¦ã¿ãã¨ããªãè²§å¼±ãªæ©è½ãããªãã®ã§ãä¸ä¾¿ã§ãã
䏿ããéã«ä»ã®ã³ã«ã¼ãã³ãå¼ã³åºãã¦ãããã¤ã«å¤ã渡ãã¨ãã§ããªãã§ããããã
ãã£ãCrystalã®ãã¡ã¤ãã¼ãä¼¼ã¦ãã¨æ¸ãã¾ããããCrystalã¯ä»ã®ãã¡ã¤ãã¼ã¨ã®éåæãªéä¿¡æ©æ§ãããã¾ãã
Pythonã³ã«ã¼ãã³ã«ã¯ãªããã³ã«ã¼ãã³éã®éåæéä¿¡ã¯futureã§ãããã§ãã
Pythonã³ã«ã¼ãã³ã¯ä¸è¬çãªã³ã«ã¼ãã³ã¨æãã¨ãã©ãã¦ããããfutureã使ã£ãéåæã¢ãã«ãæåãã¦ã³ã¼ããæ¸ãã¹ããªãã§ãããã ç©æ¥µçã«futureãªãã¸ã§ã¯ãã使ãã¾ããã¦ããã®ãããã®ããªãã¨ããã®ãä»ãæã®Pythonã³ã«ã¼ãã³ã«å¯¾ããåã®ææã§ãã