Go言語100Tips No.62

mizue
·

No.62: ゴルーチンを停止するタイミングをわからずに起動する

  • 無計画にゴルーチンを起動するとゴルーチンリークにつながる可能性がある。

  • ゴルーチンは、ヒープに割り当てられた変数、HTTP、データベースのコネクション、オープンされているファイル、ネットワークソケットなど、保持できる。ゴルーチンがリークすると、これらもリークする。

  • ゴルーチンを起動するならば、いつ停止するのかについて明確に計画を立てなければならない。

  • ゴルーチンの生存期間がアプリケーションの生存期間に結びついている場合、アプリケーションを終了する前にそのゴルーチンが完了するのを待つ方が安全。

  • mainから呼び出したfunctionの中で起動したゴルーチンは、mainがリターンした時にキャンセルされるようなコンテキストを渡す。

  • 終了時に親ゴルーチンを待たせるようにする。

func main() {

w := newWatcher()

defer w.close() // ←closeメソッドの呼び出しを遅延させる

// アプリケーションを実行

}

func newWatcher() watcher {

w := watcher()

go w.watch()

return w

}

func (w watcher) close() {

// 資源をクローズさせる

}

@mizue
Healthy Programmer