package Ġtasks Ċ Ċ import Ġcontributors .* Ċ import Ġkotlinx . coroutines .* Ċ Ċ // ĠME MO : Ċ // ĠKotlin ãģ® Coroutine ãģ¯ è» ½ éĩı ãģ§ãģĤãĤĭ ãģŁãĤģ ãĢģ éĿŀ åĲĮ æľŁ ãģ§ æĸ°ãģĹãģĦ åĩ¦çĲĨ ãĤĴè¡Į ãģĨ å¿ħè¦ģ ãģĮãģĤãĤĭ éĥ½ åº¦ ãĢģ æĸ°ãģĹãģĦ Coroutine ãĤĴ çĶŁæĪĲ ãģĹãģ¦ ãĤĤ åķıé¡Į ãģªãģĦ Ċ // Ġ ãģĿãģ® éļ Ľ ãĢģ launch , Ġasync , Ġrun Blocking ãģªãģ© ãģ® Coroutine Builder ãĤĴ åĪ©çĶ¨ ãģĹãģ¦ çĶŁæĪĲ ãģĻãĤĭ Ċ // Ġ- Ġasync : Ċ // ĠĠĠĠĠ Ġ- ĠDeferred ãĤª ãĥĸãĤ¸ãĤ§ãĤ¯ãĥĪ ãĤĴ è¿Ķ åį´ ãģĻãĤĭ ï¼Ī Future , ĠPromise ãģ¨ åĲĮ æ§ ĺ ãģ® æ¦Ĥå¿µ ï¼ī Ċ // ĠĠĠĠĠ Ġ- ĠDeferred ãģ¯ ç· ı ç§° åŀĭ ãģ§ ãĢģ Job ãĤĴ ç¶ Ļ æī¿ ãģĹãģ¦ãģĦãĤĭ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ- Ġawait () ãĤĴ åĳ¼ ãģ³ åĩº ãģĻ ãģĵãģ¨ ãģ§ çµĲæŀľ ãģ® è¿Ķ åį´ ãĤĴ å¾ħ æ©Ł ãģĻãĤĭãģĵãģ¨ ãģĮ åı¯èĥ½ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ- Ġawait All () ãģ§ List ãģ«å¯¾ ãģĹãģ¦ åħ¨ ãģ¦ ãģ® çµĲæŀľ ãĤĴ å¾ħ æ©Ł ãģĻãĤĭãģĵãģ¨ ãĤĤ ãģ§ãģįãĤĭ Ċ // Ġ- Ġlaunch : Ċ // ĠĠĠĠĠ Ġ- Ġasync ãģ¨ ãģ¯ çķ ° ãģª ãĤĬ ãĢģ çī¹å®ļ ãģ® è¿Ķ åį´ åĢ¤ ãĤĴ æľŁ å¾ħ ãģĹãģªãģĦ åł´åĲĪ ãģ« åĪ©çĶ¨ ãģĻãĤĭ Ċ // ĠĠĠĠĠ Ġ- Ġlaunch ãģ¯ Job ãĤª ãĥĸãĤ¸ãĤ§ãĤ¯ãĥĪ ãĤĴ è¿Ķ åį´ ãģĹ ãĢģ join () ãĤĴ åĳ¼ ãģ³ åĩº ãģĻ ãģĵãģ¨ ãģ§ å®Į äºĨ ãģ¾ãģ§ å¾ħ æ©Ł ãģĻãĤĭãģĵãģ¨ ãģĮ åı¯èĥ½ Ċ // Ġ- Ġrun Blocking : Ċ // ĠĠĠĠĠ Ġ- Ġ éĢļå¸¸ ãģ® éĸ¢æķ° ï¼Ī ãĥĸ ãĥŃ ãĥĥ ãĤŃ ãĥ³ãĤ° ï¼ī ãģ¨ suspend éĸ¢æķ° ï¼Ī ãĥİ ãĥ³ ãĥĸ ãĥŃ ãĥĥ ãĤŃ ãĥ³ãĤ° ï¼ī ãģ® ç¹ ĭ ãģ İ çĽ® ãģ§ åĪ©çĶ¨ ãģĻãĤĭ Ċ // ĠCor outine Builder ãĤĴ åĪ©çĶ¨ ãģĻãĤĭãģĵãģ¨ ãģ§ ãĢģ ãĤ³ ãĥ¼ãĥ« ãĥĲ ãĥĥãĤ¯ ãĤĴ å¿ħè¦ģ ãģ¨ ãģĽ ãģļ ãģ« éĿŀ åĲĮ æľŁ ãģ® è¤ĩ æķ° ãĥª ãĤ¯ ãĤ¨ ãĤ¹ãĥĪ ãģĮ ãģ§ãģįãĤĭ ãĤĪãģĨãģ« ãģªãĤĭ Ċ // Ċ // Ġ ãģ¾ãģŁ ãĢģ çī¹å®ļ ãģ® ãĤ¹ ãĥ¬ ãĥĥãĥī ãģ§ åĭķ ä½ľ ãģķ ãģĽ ãģŁ ãģĦ åł´åĲĪãģ¯ Coroutine Dispatcher ï¼Ī Coroutine ãĤĴå®Łè¡Į ãģĻãĤĭ ãĤ¹ ãĥ¬ ãĥĥãĥī ãĤĴæĮĩå®ļ ãģĻãĤĭ ãĤĤãģ® ï¼ī ãĤĴ åĪ©çĶ¨ ãģĻãĤĭ Ċ // Ġ- Ġ æľª æĮĩå®ļ Ċ // ĠĠĠĠ Ġ- Ġ åĳ¼ ãģ³ åĩº ãģĹ åħĥ ãģ® ãĤ¹ ãĥ¬ ãĥĥãĥī ãĤĴ åĪ©çĶ¨ ãģĻãĤĭ Ċ // Ġ- ĠDispatch ers . Default Ċ // ĠĠĠĠ Ġ- ĠJVM ãģ® åħ± æľī ãĤ¹ ãĥ¬ ãĥĥãĥī ãĥĹ ãĥ¼ãĥ« Ċ // ĠĠĠĠ Ġ- Ġä½¿çĶ¨ åı¯èĥ½ ãģª CPU ãģ® ãĤ³ ãĤ¢ ãģ¨ åĲĮ ãģĺ æķ° ãģ® ãĤ¹ ãĥ¬ ãĥĥãĥī ãģ§ æ§ĭæĪĲ ãģķãĤĮãĤĭ ï¼Ī ãģŁ ãģł ãģĹ ãĢģ ãĤ³ ãĤ¢ ãģĮ 1 ãģ¤ ãģ® åł´åĲĪãģ¯ 2 ãģ¤ ãģ® ãĤ¹ ãĥ¬ ãĥĥãĥī ãģĮ åŃĺåľ¨ ãģĻãĤĭ ï¼ī Ċ // Ġ- ĠDispatch ers . Main Ċ // ĠĠĠĠ Ġ- Ġãĥ¡ ãĤ¤ãĥ³ ãĤ¹ ãĥ¬ ãĥĥãĥī Ċ // Ċ // Ġsuspend éĸ¢æķ° åĨħ ãģ§ Coroutine Dispatcher ãĤĴæĮĩå®ļ ãģĻãĤĭ ãĤĪ ãĤĬ ãĤĤ ãĢģ åĳ¼ ãģ³ åĩº ãģĹ åģ ´ ãģ§ æĮĩå®ļ ãģĻãĤĭ æĸ¹ ãģĮ æŁ Ķ è» Ł ãģ« åĪ©çĶ¨ ãģĻãĤĭãģĵãģ¨ ãģĮ ãģ§ãģįãĤĭ ãģ®ãģ§ èī¯ ãģĦ Ċ // ĠĠĠĠ Ġlaunch ( Dispatch ers . Default ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠ Ġval Ġusers Ġ= Ġload Contribut ors Concurrent ( service , Ġreq ) Ċ // ĠĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . Main ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠ Ġupdate Results ( users , ĠstartTime ) Ċ // ĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠ Ġ} Ċ // ĠâĢ » Ġ ç¢º å®Ł ãģ« çī¹å®ļ ãģ® ãĤ¹ ãĥ¬ ãĥĥãĥī ãģ§ å®Łè¡Į ãģķ ãģĽ ãģŁ ãģĦ åł´åĲĪãģ¯ suspend éĸ¢æķ° åĨħ ãģ§ æĮĩå®ļ ãģĹ ãĤĭ ãģ® ãĤĤ ãģĤãĤĬ Ċ // ĠĠĠĠ Ġsuspend Ġfun Ġrefresh Title () Ġ{ Ċ // ĠĠĠĠĠĠĠ Ġwith Context ( Dispatch ers . IO ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġnetwork . fetch New Welcome (). await () Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtitle Dao . insert Title ( Title ( result )) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( error : ĠFake Network Exception ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠTitle Refresh Error ( error ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠĠĠĠĠ Ġ} Ċ // ĠĠĠ Ġ} Ċ suspend Ġfun Ġload Contribut ors Concurrent ( service : ĠGitHub Service , Ġreq : ĠRequest Data ): ĠList < User > Ġ= Ġcoroutine Scope Ġ{ ĊĠĠĠ Ġval Ġrepos Ġ= Ġservice ĊĠĠĠĠĠĠĠ Ġ. get Org Repos ( req . org ) ĊĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġlog Repos ( req , Ġit ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. body List () ĊĊĠĠĠ Ġval Ġdeferred s : ĠList < Deferred < List < User >>> Ġ= Ġrepos . map Ġ{ Ġrepo Ġ-> ĊĠĠĠĠĠĠĠ Ġasync Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġservice . get Repo Contribut ors ( req . org , Ġrepo . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġlog Users ( repo , Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. body List () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdeferred s . await All (). flatten (). aggregate () Ċ }