ユニクロの レジから学ぶ Goroutine #yapc8oji #yapc8ojiA /uniqlo_golang

ユニクロの レジから学ぶ Goroutine #yapc8oji #yapc8ojiA /uniqlo_golang

ユニクロのレジは多くの客が並んでも効率良く捌けるような工夫がされています。
そんなユニクロのレジの工夫はちょうどGoの並列化の仕組み(goroutine・channel)と非常に似ています。
そこで本発表ではユニクロのレジの工夫を例に挙げて、goroutineの仕組みや実プログラムでの活用例などを紹介します。

https://github.com/hachiojipm/yapcasia-8oji-2016mid-timetable/issues/73
https://gist.github.com/catatsuy/4b4ef8f0fe7b547ac73a25cfeba21d05

C0ac34dd3f585ed25b2f79857e5b174d?s=128

Kaneko Tatsuya

July 03, 2016
Tweet

Transcript

  1. ϢχΫϩͷ Ϩδ͔ΒֶͿ (PSPVUJOF ZBQDPKJZBQDPKJ" YAP(achimon)C::Asia Hachioji 2016 mid in Shinagawa

    @catatsuy
  2. ΞδΣϯμ • ࣗݾ঺հ • ϢχΫϩͷϨδʹ͍ͭͯ • GoݴޠͰ࣮૷ͨ͠ϢχΫϩͷϨδͱͦͷख๏ • ·ͱΊ

  3. ࣗݾ঺հ w ֤छ4/4Λ!DBUBUTVZͰ΍͍ͬͯΔ w ͔͍ͨͭͱݺ͹ΕΔ͜ͱ͕ଟ͍ w ϐΫγϒגࣜձࣾͰΠϯϑϥˠQJYJWϝϯςφϯεɾ޿ࠂ݉೚ʹ w ୯ஶʰQJYJWΤϯδχΞ͕ڭ͑Δϓϩάϥϛϯάೖ໳ʢ੕ւࣾ৽ ॻʣʱ

    w ϐΫγϒࣾ಺ͷඇΤϯδχΞ޲͚ͷϓϩάϥϛϯάݚमͷॻ੶Խ w *46$0/ग़୊νʔϜͷਓ w ΈΜͳग़ͯͶ
  4. ࠓճͷ࿩ w ϢχΫϩʢ৽॓ͷϏοΫϩʣͷϨδ͸٬ʢλεΫʣΛޮ཰ྑ͘ ࡹ͘࢓૊Έ͕͋Δ w ϢχΫϩͷϨδΛ(PݴޠͰදݱ͠ɺͦ͜Ͱ࢖ΘΕͨख๏ͷ঺հ w ಛʹHPSPVUJOFͱνϟωϧ w Ұ෦؆ུԽ͍ͯ͠·͕͢ɺ࣮༻ՄೳͳίʔυͰ͢

    w (PݴޠͷHPSPVUJOFͱνϟωϧ͸γϯϓϧͳϧʔϧ͔͠ͳ͍ ͕ɺͱͯ΋ύϫϑϧ w ޮ཰ྑ͘$16ͷίΞΛ࢖͍੾ΕΔίʔυΛॻ͚Δ
  5. ϢχΫϩͷϨδͷߦྻ ٬ ෰ΛͨͨΉਓ Ϩδͷਓ ٬͕ҰྻʹϨδʹฒͿ Ϩδ͕ۭ͍ͨΒ ٬͸ۭ͍ͨϨδʹߦ͘

  6. Ϩδͷਓʹ٬͕෰Λ౉ͯ͠ Ϩδͷਓ͕஋ஈΛܭࢉ͢Δ ෰T ٬ Ϩδͷਓ

  7. ͓ۚΛ෷ͬͯ঎඼Λड͚औΔ ᶄྉۚΛ੥ٻ ᶅ͓ۚΛࢧ෷͏ ᶃ෰Λ౉͢ ᶆͨͨΜͩ෰Λ౉͢ Ϩδͷਓ ಉظΛऔΔ ٬ ෰ΛͨͨΉਓ ᶅͱᶆͷ྆ํ͕ऴྃͯ͠ॲཧ͕ऴྃ

  8. None
  9. (Pͷߏ଄ମ w (Pͷߏ଄ମ͸pFMEΛ࣋ͪɺܕͱ໊લΛࢦఆ͢Δ w sync.Mutex͸TZODύοέʔδͰఆٛ͞Ε͍ͯΔߏ଄ମ w ແ໊ͰຒΊࠐΉͱDPNNFSߏ଄ମʹsync.Mutexͷ ϝιου͕ຒΊࠐ·Εͯ࢖͑ΔΑ͏ʹͳΔ w sync.Mutex͸ޙͰઆ໌͢Δ

    w []*clothes͸DMPUIFTͷϙΠϯλͷTMJDF w ࣅͨ֓೦Ͱ഑ྻͱTMJDF྆ํ࢖͑Δ͕ɺ഑ྻΑΓ΋TMJDF Λ࢖͏ʢͱ͍͏ΑΓ഑ྻ͸΄΅࢖Θͳ͍ʣ w (Pͷ഑ྻ͸ཁૉ਺ΛؚΊͯܕͳͷͰɺ్தͰαΠζ ΛมߋͰ͖ͳ͍ w TMJDFͷཁૉ਺͸ม͑ΒΕΔ w ϝιου΋ఆٛͰ͖Δʢ$ݴޠͷߏ଄ମͱ͸ҧ͏ʣ
  10. ٬Λฒ΂Δʢνϟωϧʣ w ૊ΈࠐΈͷNBLFؔ਺Λ࢖͏ͱνϟωϧͷॳظԽ͕Ͱ͖Δ w ୈҾ਺Ͱνϟωϧͷ༰ྔΛࢦఆ͢Δ w go func()ͷதͷॲཧ͸HPSPVUJOFͰ࣮ߦ͞ΕΔ w for

    {}͸ແݶϧʔϓ͕ͩɺHPSPVUJOFͷதͰ࣮ߦ͢Ε͹NBJOؔ਺ͷअຐΛͤͣ ʹॲཧΛͣͬͱ࣮ߦͰ͖Δ w νϟωϧ΁஋Λૹ৴͢Δͷ΋ड৴͢Δͷ΋Ͱߦ͏ w νϟωϧͷ௕͕͞ʹͳΔ·Ͱ٬Λૹ৴͢Δ w νϟωϧͷ௕͕͞ҎԼʹͳͬͨΒʹͳΔ·Ͱ٬Λૹ৴͢Δ w ຊ౰͸٬ʹΑͬͯങ͏΋ͷ͸ҧ͏͕ɺࠓճ͸શһಉ͡ʹͨ͠
  11. ฒྻॲཧ਺Λ੍ޚ͢Δ w νϟωϧ͸༰ྔҎ্ͷ஋ΛૹΔͱ଴ͪʹͳΔ w ༰ྔͷνϟωϧͰฒྻ਺Λ੍ޚ͢Δ w ˠϨδʹਓ͍Δ w λεΫΛେྔʹಉ࣮࣌ߦ͢Δͱ๫૸͢ΔͷͰɺ࣮ ϓϩάϥϜͰ΋ඞཁ

    w ࣮ߦ͕ऴྃͨ͠Βνϟωϧܦ༝Ͱ௨஌͞Εͯɺ଴ ͪʹͳ͍ͬͯΔHPSPVUJOFͷॲཧ͕࢝·Δ w ˠϨδ͕ۭ͍ͨΒۭ͍ͨϨδʹ٬͕ߦ͘ • νϟωϧͷܕ͸int΍boolͰ΋ಈ͘ • ۭͷߏ଄ମstruct{}Λ࢖͏ͱνϟωϧͷ஋ʹ৘ ใΛ࣋ͨ͢͜ͱ͕Ͱ͖ͳ͍ͷͰɺਪ঑͞ΕΔ • cf: GoݴޠͰCPU਺ʹԠͯ͡ฒྻॲཧ਺Λ੍ݶ͢Δ | SOTA http://deeeet.com/writing/ 2014/07/30/golang-parallel-by-cpu/ ࣮ߦ͕ऴྃͨ͠ ͷͰड৴͢Δ ༰ྔ෼Λૹ৴ ͨ͠Β଴ͭ
  12. Ϩδͷਓͱ෰ΛͨͨΉਓͷڠௐ w Ϩδͷਓ͕ྉۚΛܭࢉ͔ͯ͠Βɺ෰ΛͨͨΉॲཧΛ ෰ΛͨͨΉਓʹ΍ΒͤΔ • makeؔ਺ͷୈ2Ҿ਺Λ༩͑ͳ͚Ε͹༰ྔ͕0ͷνϟ ωϧ͕࡞ΕΔ(unbuffered channel) w ͓ۚΛ෷͏ॲཧͱ෰ΛંΓͨͨΉॲཧ͕྆ํऴ

    ྃˠϨδͷॲཧ͕ऴྃ w ˠ෰͕ͨͨΉॲཧ͕ऴΘΔͷΛνϟωϧΛ࢖ͬ ͯ଴ͭ w HPSPVUJOF͔Βߏ଄ମʹॻ͖ࠐΉؒʹɺࢀর͢Δͱ ڝ߹ঢ়ଶʹͳΔ w HPSPVUJOF͔Βείʔϓ֎ͷม਺ʹॻ͖ࠐΉࡍʹ ͸ඞͣϩοΫΛऔΓɺࢀর͞Εͳ͍Α͏ʹ͢Δ • sync.MutexͷϝιουLock() Unlock()Λ ࢖͏ͱͰ͖Δ ྉۚܭࢉ ෰ΛͨͨΉਓ ͷॲཧ ͜͜ʹ͕͔͔࣌ؒΔॲཧ ͓ۚΛࢧ෷͏ॲཧͱ ෰ΛͨͨΉॲཧͷ ྆ํ͕ऴྃͯ͠ Ϩδۀ຿ऴྃ
  13. NBJOؔ਺ͷऴྃ • ดళ࣌ؒʹͳΔ·Ͱmainؔ਺Λऴྃͤ͞ͳ͍ • mainؔ਺͸HPSPVUJOFͷऴྃΛ଴ͨͳ͍ͷͰɺνϟ ωϧͳͲΛ࢖ͬͯऴྃ͠ͳ͍Α͏ʹ͢Δ • ͦ͏͠ͳ͍ͱ͙͢ʹऴྃ͢Δ • ຊདྷ͸ҟৗ࣌ʹ҆શʹดళͰ͖ΔΑ͏ʹ͢΂͖

    • ࠓճ͸time.Sleep()Λͨ͠ • mainؔ਺͕ऴྃ͠ͳ͍ؒʹHPSPVUJOF಺ͷॲཧ͕ ૸Δ
  14. None
  15. ·ͱΊ w ϢχΫϩͷϨδ͸٬ʢλεΫʣΛޮ཰ྑ͘ࡹ͘࢓૊Έ͕͋Δ w ٬ΛྻͰ؅ཧ w Ϩδۀ຿Λ઀٬ͱ෰ΛͨͨΉॲཧʹ෼ׂ w (PݴޠͷHPSPVUJOFͱνϟωϧ͸γϯϓϧͳϧʔϧ͔͠ͳ͍ ͕ɺͱͯ΋ύϫϑϧ

    w ޮ཰ྑ͘$16ͷίΞΛ࢖͍੾ΕΔίʔυΛॻ͚Δ w ࠓճͷίʔυ͸࣮ࡍͷιϑτ΢ΣΞͰ࢖͑Δ w ϢχΫϩͷϨδ͸ඇৗʹγεςϚνοΫͰޮ཰͕ྑ͍࢓૊Έ