Upgrade to Pro — share decks privately, control downloads, hide ads and more …

sync.Onceを完全に理解する - tenntenn.go#3

sync.Onceを完全に理解する - tenntenn.go#3

この資料はtenntenn.go#3で登壇を行った際に用いた資料です。

■ tenntenn.goとは
tenntenn.goはtenntennが主催し、そしてすべてのセッションがtenntennによる登壇のGoに関する勉強会です。

イベントページ:https://tenntenn.connpass.com/event/239966/
ハッシュタグ:#tenngo
再放送:https://tenntenn.connpass.com/event/240761/
資料(Googleスライド):https://tenn.in/synconce
動画:https://tenn.in/synconce-video

■ 登壇者&主催者

・名前:tenntenn / 上田拓也
・HP:https://tenntenn.dev
・Twitter:https://twitter.com/tenntenn

メルカリ/メルペイ所属。バックエンドエンジニアとして日々Goを書いている。Google Developer Expert (Go)。一般社団法人Gophers Japan代表。Go Conference主催者。大学時代にGoに出会い、それ以来のめり込む。人類をGopherにしたいと考え、Goの普及に取り組んでいる。複数社でGoに関する技術アドバイザーをしている。マスコットのGopherの絵を描くのも好き。

■ お仕事の依頼について

副業にて技術顧問やアドバイザーなどを行っています。過去の実績や問い合わせフォームは以下のURLからご確認ください。
https://tenntenn.dev/ja/job/

#golang #tenntenn #tenngo #Go言語

tenntenn - Takuya Ueda

February 25, 2022
Tweet

More Decks by tenntenn - Takuya Ueda

Other Decks in Technology

Transcript

  1. The Go gopher was designed by Renée French. The gopher

    stickers was made by Takuya Ueda. Licensed under the Creative Commons 3.0 Attributions license. sync.Onceを完全に理解する 2022年02月25日(金) 資料:https://tenn.in/synconce
  2. 上田拓也 Go ビギナーズ
 Go Conference
 @tenntenn tenntenn.dev Google Developer Expert

    (Go) 一般社団法人 Gophers Japan 代表理事 Experts Team
  3. sync.Once関数 ▪ 1度しか実行しない関数 • 1回以上Doメソッドを呼んでも意味がない • 複数のゴールーチンから1回しか呼ばないようにするために利用する func f() {

    fmt.Println("Do!!") } func main() { var once sync.Once once.Do(f) once.Do(f) fmt.Println("done") } 3 2回目は実行されない Playgroundで動かす
  4. sync.Once関数の使い所 ▪ 必ず1度しか実行されないことが保証される • チャネルのクローズ ◦ 同じチャネルをクローズするとパニックが起きる • 初期化 ◦

    最初のメソッド実行時に1度だけ実行したい処理 ◦ Google App Engineのウォームアップリクエストにおける初期化 • 早いものがち ◦ 複数のゴールーチンが実行する可能性のある処理 ◦ 1度だけ、1ゴールーチンだけ実行する ◦ クリティカルセクションを守る ◦ 冪等性を持たせる
  5. os/execパッケージでの利用例 ▪ 1度しか閉じないファイル • https://cs.opensource.google/go/go/+/master:src/os/exec/ exec.go;l=595-609 • *os.File型を埋め込んでデコレーションしている type closeOnce

    struct { *os.File once sync.Once err error } func (c *closeOnce) Close() error { c.once.Do(c.close) return c.err } func (c *closeOnce) close() { c.err = c.File.Close() }
  6. まとめ ▪ sync.Once関数は便利 • チャネルのクローズ • 初期化 • 早いものがち ▪

    コードリーディングすると良く分かる • パニックしたときは? • どうやって1回に限定しているの? • パフォーマンス改善