Ktorͱʁ w +FU#SBJOTࣾͷ044 w 4FSWFSαΠυͱ$MJFOUαΠυͷͭͷϓϩδΣΫτ͕͋Δ 4FSWFSܰྔͳ8FC"QQMJDBUJPO'SBNFXPSLΛఏڙ $MJFOU"TZODISPOPVT)UUQ$MJFOUΛఏڙ w ,PUMJOݴޠͷػೳΛϑϧʹ׆༻͍ͯ͠Δͷ͕ಛ FY$PSPVUJOFT
,PUMJO/BUJWF
.VMUJQMBUGPSN
Ktorͱʁ w +FU#SBJOTࣾͷ044 w 4FSWFSαΠυͱ$MJFOUαΠυͷͭͷϓϩδΣΫτ͕͋Δ 4FSWFSܰྔͳ8FC"QQMJDBUJPO'SBNFXPSLΛఏڙ $MJFOU"TZODISPOPVT)UUQ$MJFOUΛఏڙ w ,PUMJOݴޠͷػೳΛϑϧʹ׆༻͍ͯ͠Δͷ͕ಛ FY$PSPVUJOFT
,PUMJO/BUJWF
.VMUJQMBUGPSN
͜ͷηογϣϯͷత w ,UPSͷઃܭಛɺࢥͳͲΛཧղ͢Δ͜ͱͰ 4FSWFS4*EF,PUMJOͱͯ͠ͷ,UPSͷਂ͍ཧղΛಘΔ w ,UPS͕$PSPVUJOFTΛͬͯͲͷΑ͏ʹඇಉظ ϓϩάϥϛϯάϞσϧΛ࣮ݱ͍ͯ͠Δͷ͔Λཧղ͢Δ͜ͱͰ $PSPVUJOFTͷԠ༻తͳ͍ํΛͬͯΒ͏
w ϑϨʔϜϫʔΫͷҰൠతͳओཁػೳΛίΞίϯϙʔωϯτ͔Β ͢Δ͜ͱͰϚΠΫϩϑϨʔϜϫʔΫΛ࣮ݱ DG3VCZPO3BJMTͱ4JOBUSB
4QSJOH'SBNFXPSL w σϑΥϧτઃఆͰϩΪϯάػೳ ςϯϓϨʔτΤϯδϯ+TPO.BQQFSͳͲಋೖ͞Ε͍ͯͳ͍ ബ͍ϑϨʔϜϫʔΫ
ϚΠΫϩϑϨʔϜϫʔΫͷϝϦοτ w ඞཁ࠷খݶͷߏͰ։ൃΛ։࢝Ͱ͖ΔͷͰ ϓϩτλΠϐϯάͱͯ͠ͷΞϓϦέʔγϣϯ ϚΠΫϩαʔϏεతʹ୯ҰͷΛ࣋ͭΞϓϦέʔγϣϯΛ খ͘͞࡞Γ࢝ΊΔͷʹద͍ͯ͠Δ w ҉తͳઃఆػೳ͕΄ͱΜͲͳ͍ͨΊ ϑϨʔϜϫʔΫͱ࣮ͯ͠ߦ͞Ε͍ͯΔػೳΛ ΞϓϦέʔγϣϯ։ൃऀ͕Ѳ͢Δͷ͕ൺֱత༰қ
FeatureʹΑΔϓϥάΠϯػߏ w ೝূ%*ͳͲͷ࣮ફతͳػೳ͔ΒϧʔςΟϯά ϩΪϯάͳͲͷجຊతͳػೳ·Ͱͷ΄ͱΜͲ͕ 'FBUVSFͱ͍͏ϓϥάΠϯܗࣜͰຊମ͔Β Γग़ͯ͠ఏڙ͞Ε͍ͯΔ w 'FBUVSFΛΞϓϦέʔγϣϯʹJOTUBMM͢Δ͜ͱͰ ࣗ༝ʹػೳΛՃͰ͖Δ w ಠࣗʹ$VTUPN'FBUVSFΛ࣮͢Δ͜ͱՄೳ
ύΠϓϥΠϯػߏ w ,UPS͕ϦΫΤετΛड͚ͯॲཧΛߦ্͍ͬͯ͘Ͱ ΞϓϦέʔγϣϯ։ൃऀ͕ॊೈʹ'FBUVSF3PVUJOHຖͷॱংΛ ఆٛͰ͖ΔΑ͏ͳܭࢉύΠϓϥΠϯΛఏڙ w ܭࢉύΠϓϥΠϯΛ֦ு͢ΔͨΊͷ"1*ఏڙ͞Ε͍ͯͯ ಠࣗͷܭࢉύΠϓϥΠϯΛ࣮ͯ͠ $VTUPN'FBUVSFͱͯ͠JOTUBMM
࣮ߦ͢Δ͜ͱՄೳ
ϓϥάΠϯͱύΠϓϥΠϯػߏ w ,UPSຊମ࠷ݶͷػೳ͔࣋ͨ͠ͳ͍ΘΓʹ 'FBUVSFΛͬͨϓϥάΠϯػߏʹΑͬͯ Ϣʔβʔ͕ࣗ༝ʹػೳΛՃ͢Δ͜ͱ͕Ͱ͖Δ w ,UPS͔Βఏڙ͞ΕΔܭࢉύΠϓϥΠϯػߏͱ"1*ʹΑͬͯ ΞϓϦέʔγϣϯ։ൃऀ͕ݻ༗ͷϧʔςΟϯάॲཧ ෳϧʔςΟϯάʹ·͕ͨͬͨڞ௨ॲཧΛॊೈͳॱ൪Ͱ ࣮ߦͤ͞Δ͜ͱ͕Մೳ
CoroutinesͷϨϕϧͳૢ࡞ w $PSPVUJOFΛγϯϓϧʹ͏͚ͩͳΒҙࣝͤͣͱࠔΒͳ͍ ͜ͱ͕ଟ͍͕ϥΠϒϥϦΛ࡞Δͱ͖ͳͲѻ͑Δͱཱͭ w $POUJOVBUJPOTVTQFOEؔͷࣗಈมܗ w TUBSU$PSPVUJOF TUBSU$PSPVUJOF6OJOUFSDFQUFE0S3FUVSO w TVTQFOE$PSPVUJOF6OJOUFSDFQUFE0S3FUVSO
Continuation (ܧଓ) w TVTQFOEؔͰதஅ͞Εͨίϧʔνϯͷঢ়ଶ w தஅ͞Εͨ෦Ҏ߱ͷΓͷॲཧ ίʔϧόοΫ Λද͢ w SFTVNF8JUIϝιουྃίʔϧόοΫͰ͋Γ ίϧʔνϯͷྃ࣌ʹޭɾࣦഊͷ͍ͣΕ͔Λฦ͢ public interface Continuation { public val context: CoroutineContext public fun resumeWith(result: Result) }
suspendؔ suspend fun susFuncA() { delay(1000L) } val block: suspend () -> Unit = {} w ؔͰଞͷTVTQFOEؔΛݺͼग़͢͜ͱͰ ࣮ߦεϨουΛϒϩοΫͤͣʹ ίʔυ࣮ߦΛதஅ͢ΔՄೳੑͷ͋Δؔ w TVTQFOEؔଞͷTVTQFOE͔ؔΒͷΈݺͼग़͢͜ͱ͕Մೳ TVTQFOEؔϥϜμ fun normalFunc() { susFuncA(1000L) } ௨ৗͷ͔ؔΒͷݺͼग़͠
suspendؔ suspend fun susFuncA() { delay(1000L) } val block: suspend () -> Unit = {} w ؔͰଞͷTVTQFOEؔΛݺͼग़͢͜ͱͰ ࣮ߦεϨουΛϒϩοΫͤͣʹ ίʔυ࣮ߦΛதஅ͢ΔՄೳੑͷ͋Δؔ w TVTQFOEؔଞͷTVTQFOE͔ؔΒͷΈݺͼग़͢͜ͱ͕Մೳ TVTQFOEؔϥϜμ fun normalFunc() { susFuncA(1000L) } ௨ৗͷ͔ؔΒͷݺͼग़͠ ͳͥTVTQFOEؔ ௨ৗͷ͔ؔΒݺͼग़͢͜ͱ͕ग़དྷͳ͍ͷ͔ʁ
suspendCoroutineUninterceptedOrReturn w ίϧʔνϯͰݺͿ͜ͱͰίϧʔνϯ͕தஅͨ͠Γͷঢ়ଶΛ $POUJOVBUJPOΠϯελϯεͱͯ͠औಘͰ͖Δ"1* w ϥϜμࣜͰ$POUJOVBUJPOΠϯελϯεΛࢀর͠ ίϧʔνϯͷதஅɾྃͱ͍ͬͨঢ়ଶΛ੍ޚͰ͖Δ suspend inline fun suspendCoroutineUninterceptedOrReturn( crossinline block: (Continuation) -> Any? ): T
w ίϧʔνϯΛதஅঢ়ଶͱͯ͠ҡ࣋͢Δ߹ $03065*/&@4641&/%&%ϚʔΧʔΛฦ͢ w ίϧʔνϯΛྃ͢Δ߹ ݁ՌΛSFTVNF8JUIϝιουʹ࣮ͯ͠ߦ suspend inline fun suspendCoroutineUninterceptedOrReturn( crossinline block: (Continuation) -> Any? ): T suspendCoroutineUninterceptedOrReturn
internal actual inline fun (suspend R.(A) -> Unit).startCoroutineUninterceptedOrReturn3( receiver: R, arg: A, continuation: Continuation ): Any? { val function = (this as Function3, Any?>) return function.invoke(receiver, arg, continuation) } w ,UPSͰ$POUJOVBUJPOʹՃ͑ͯҙͷܕͷΦϒδΣΫτΛ Ҿ͖ͯ͠৽ͨʹίϧʔνϯΛ։࢝͢ΔؔΛಠ࣮͍ࣗͯ͠Δ w ΈࠐΈؔͱ͍ۙॲཧΛҎԼͷؔͰ࣮ݱ͍ͯ͠Δ
internal actual inline fun (suspend R.(A) -> Unit).startCoroutineUninterceptedOrReturn3( receiver: R, arg: A, continuation: Continuation ): Any? { val function = (this as Function3, Any?>) return function.invoke(receiver, arg, continuation) } w ҾΛ"ܕ͔͠ड͚औΒͳ͍ͣͷϥϜμࣜ UIJT ͕Կނ͔ Ҿͱͯ͠"ܕɾ$POUJOVBUJPOͷ̎ͭΛड͚औΔ'VODUJPOܕʹ Ωϟετ͞Ε͔ͯΒ࣮ߦ͞Ε͍ͯΔ
internal actual inline fun ((suspend) R.(A, Continuation) -> Unit). startCoroutineUninterceptedOrReturn3( receiver: R, arg: A, continuation: Continuation ): Any? { val function = (this as Function3, Any?>) return function.invoke(receiver, arg, continuation) } w ࣮ϥϜμࣜ UIJT TVTQFOEϥϜμͳͷͰίϯύΠϧ࣌ʹ Ҿͱͯ͠$POUJOVBUJPOड͚औΔϥϜμࣜʹม͞ΕΔʂ w ͕࣮ͨͬͯ͠ߦ࣌ͷΩϟετޭ͢Δ ੜ͞ΕΔίʔυ ٙࣅίʔυ
internal actual inline fun ((suspend) R.(A, Continuation) -> Unit). startCoroutineUninterceptedOrReturn3( receiver: R, arg: A, continuation: Continuation ): Any? { val function = (this as Function3, Any?>) return function.invoke(receiver, arg, continuation) } w ࣮ϥϜμࣜ UIJT TVTQFOEϥϜμͳͷͰίϯύΠϧ࣌ʹ Ҿͱͯ͠$POUJOVBUJPOड͚औΔϥϜμࣜʹม͞ΕΔʂ w ͕࣮ͨͬͯ͠ߦ࣌ͷΩϟετޭ͢Δ ੜ͞ΕΔίʔυ ٙࣅίʔυ
internal actual inline fun ((suspend) R.(A, Continuation) -> Unit). startCoroutineUninterceptedOrReturn3( receiver: R, arg: A, continuation: Continuation ): Any? { val function = (this as Function3, Any?>) return function.invoke(receiver, arg, continuation) } w ࣮ϥϜμࣜ UIJT TVTQFOEϥϜμͳͷͰίϯύΠϧ࣌ʹ Ҿͱͯ͠$POUJOVBUJPOड͚औΔϥϜμࣜʹม͞ΕΔʂ w ͕࣮ͨͬͯ͠ߦ࣌ͷΩϟετޭ͢Δ ੜ͞ΕΔίʔυ ٙࣅίʔυ
KtorͱඇಉظॲཧύΠϓϥΠϯ w ,UPSͷඇಉظॲཧύΠϓϥΠϯ্ͰதஅॲཧΛ։࢝ͨ͠Γ ผεϨουͰಈ࡞͢ΔΑ͏ͳίϧʔνϯΛ։࢝ͨ͠ͱ͖ʹ ύΠϓϥΠϯͷ֤ϑΣΠζ͕ͲͷΑ͏ʹ࣮ߦ͞ΕΔ͔Λհ w QSPFFEϝιουͳͲɺΑΓޮతʹॲཧΛ࣮ߦ͞ΕΔͨΊͷ "1*͕,UPS͔Βఏڙ͞Ε͍ͯΔ
CoroutinesͷϨϕϧAPI w ίϧʔνϯͰߴ͍ύϑΥʔϚϯεͳͲΛٻΊΔࡍʹ ॏཁʹͳͬͯ͘ΔΑ͏ͳϨϕϧͷ"1*Λհ w $POUJOVBUJPOTVTQFOEؔͷࣗಈมܗ w TUBSU$PSPVUJOF TUBSU$PSPVUJOF6OJOUFSDFQUFE0S3FUVSO w TVTQFOE$PSPVUJOF6OJOUFSDFQUFE0S3FUVSO
KtorΛCoroutinesͰඥղ͘ w ඇಉظॲཧύΠϓϥΠϯͰͷύϑΥʔϚϯεΛ ͋͛ΔͨΊʹ෦తʹίϧʔνϯͷϨϕϧ"1*Λ׆༻ͨ͠ ༷ʑͳςΫχοΫΛհ w ,UPSΛΘͳ͍ΞϓϦέʔγϣϯ࡞ΔࡍͰ େྔͷίϧʔνϯΛͬͯߴ͍ύϑΥʔϚϯεΛ ٻΊΒΕΔΑ͏ͳঢ়گͰࢀߟʹͳΔΑ͏ͳ࣮͕ଘࡏ