Go Conference 2018 Spring (https://gocon.connpass.com/event/82515/) でシグナルを Goroutine へブロードキャストする & それを context.Context でラップする話をしました
(PSPVUJOFNFFUTBTJHOBM!(P$POGFSFODF4QSJOH
View Slide
!DPEFIFY !$PEF)FYw *MJLF1FSM94(Pw *MJWFJO5PLZPGSPN0LJOBXBw ❤$BQCBUUJOHDFOUFSw .FSDBSJ *OD/FXw IUUQTDPEFIFYIBUFCMPKQ
Έͳ͞Μ
γάφϧͬͯ·͔͢ʁ
ͬͯ·͢ΑͶʂ
Βͳ͍ਓͷͨΊʹ
શ͘໘ന͘ͳ͍ʜ
% man signalʮࠓ͙࣮͢ߦʯ
Ͳ͏͍͏࣌ʹ γάφϧΛ͍·͔͢ʁ
γάφϧΛ͏໘w ॲཧΛ தஅcऴྃc࠶ىಈ͍ͨ͠w ׂΓࠐΈॲཧΛߦ͍͍ͨw γάφϧΛૹΔ͜ͱͰڍಈΛมߋ͍ͨ͠ͳͲ ʢϨΞέʔεʁʣ
γάφϧϓϩηεʹ ૹΓ·͢ΑͶ
ߋʹݴ͏ͱ
ϓϩηεࢠϓϩηε ͷγάφϧૹ৴Մೳ
͔͠͠
զʑ͕ѻ͏ͷ HPSPVUJOF
HPSPVUJOF γάφϧΛૹΓ͍ͨ
͔݁Β
HPSPVUJOF γάφϧΛૹ৴Ͱ͖ͳ͍
͕ͩ ࣅͨΑ͏ͳ͜ͱͰ͖Δ
γάφϧΛ௨͢Δશͯͷ(PSPVUJOFϒϩʔυΩϟετ
ඞཁͳ͜ͱw ௨༻ͷDIBOOFMw ͲΜͳγάφϧ͕ૹΒΕ͖͔ͯͨ
close(ch)
close(ch)DIΛ͍࣋ͬͯΔશͯͷHPSPVUJOF DIBOOFMΛૹ৴͢Δ͜ͱ͕Ͱ͖Δ
signal.Notify(ch)
signal.Notify(ch)DI͔Βड͚औΕྑ͍
࣮ࡍͷίʔυ
γάφϧ௨Λߦ͏ߏମ
NBJOͷॲཧ
ΊͬͪΌ؆୯
͔͠͠ɺզʑ context.Context ཉ͍͠
context.Context γάφϧϋϯυϥͷ࣮γάφϧड͚औΕΔcontext.Context
context.Context
context.Contextw جຊతʹΩϟϯηϧͷͨΊͷDIBOOFMͷड͚͠Λߦ͏తʹ͏w context.Value ͋Δ͕ɺࠓճؾʹ͠ͳ͍w JOUFSGBDFͰ͋Δ
͔͞͞ͳϧʔϧʜ
IUUQTHPMBOHPSHQLHDPOUFYUl%POPUTUPSF$POUFYUTJOTJEFBTUSVDUUZQFJOTUFBEʜzfunc DoSomething(ctx context.Context, arg Arg) error { // ... use ctx ... }
ͳΔ΄Ͳ
͜͜Ͱ ࣍ͷ63-Λݟ·͠ΐ͏IUUQTHJUIVCDPN$PEF)FYHPMFUTZOPQTJT
context.Context ҰͭͰ྆ํड͚औΕΔ
࣮IUUQTHJTUHJUIVCDPN$PEF)FYDCFECGDBGGECGB
ߏମDUYΛ֨ೲ͢Δ
ٯߦҝͰ͢Ͷ
JOUFSGBDFͷ࣮
͜ΕͰԿ͕خ͍͠ͷ͔ʁ
خ͍͜͠ͱw ड৴෦ͷίʔυ͕؆ܿʹͳͬͯಡΈ͘͢ͳΔw γάφϧͷ௨ͱDPOUFYUΩϟϯηϧͷ௨ͷ྆ํΛγϯϓϧʹॻ͚Δw ϥοϓ͢ΔલͷDPOUFYUͱͯ͠ѻ͑ΔͷͰ҆৺
DPOUFYUͷϥοϓʹҙ͢Δ͜ͱ
ҙ͢Δ͜ͱw ֎෦͔ΒԿ͔͠Β௨͕͋ͬͯɺͦΕΛτϦΨʔʹ֤HPSPVUJOF௨͍ͨ͠߹ྑͦ͞͏w ΉΈʹϥοϓ͢Δͱத͕͔Βͳ͍ɺҙਤ͕Θ͔Βͳ͍͕ൃੜ͢Δ
༷ʑͳؾ͕࣋ͪ͋Δͱ ࢥ͍·͕͢
͝੩ௌ ͋Γ͕ͱ͏͍͟͝·ͨ͠1MFBTFEJTDVTTXJUINF