cybozu go well - arosh/arosh.github.com GitHub Wiki

https://github.com/cybozu-go/well

Environment とはなにか

標準の context.Context に対していくつかの便利な機能を付与したもの。概念的には context.Context と同じもの。

well に対する Stop()Wait() はなにか

well.Wait() はグローバルの Environment に対して Wait() しているだけ。ただし、このグローバルな Environment は、プロセスに対して SIGINT と SIGTERM が呼ばれた場合に 環境変数 CANCELLATION_DELAY_SECONDS で指定された分だけ sleep し、その後 EnvironmentCancel するシグナルハンドラーが設定されている。

env.Wait() とはなにか

  1. Environment に対して Stop() または Cancel() が呼ばれるのを待つ
  2. Go() で立ち上げられた goroutine が全部完了する(呼び出した関数が戻り値を返す)のを待つ
  3. 念のため Environment が持っている context もキャンセルしておく。Go() で立ち上げられた関数が引数の context.Context をもとに新しく goroutine を立ち上げていた場合に zombie になってしまった場合のケアのため cancel() しておく。よく考えると Go() の中で関数呼び出しが終わったあとで cancel() しているのでこれは意味がないかもしれない。

env.Go() とはなにか

  • Wait()Stop()Cancel() に対応した goroutine を立ち上げる
  • 関数の戻り値の error に何か入っていたら Environment に Cancel() を送る
  • 関数呼び出しが終わったあとでに、関数の渡した context を cancel() する
  • もし Environment が既に Stop()Cancel() されていたら goroutine の立ち上げはしない(graceful stop 対応)

env.Cancel() とはなにか

  • Go() で新しい goroutine が立ち上げられないように設定する
  • Go() で立ち上げた関数に渡していた context を cancel() する

Cancel() は呼び出し済みかどうか判定するフラグを持っているので、何回でも呼び出しても最初の一回しか効果がない。

env.Stop() とはなにか

  • Go() で新しい goroutine が立ち上げられないように設定する

以上である。起動済みの goroutine を強制的に止めるといった機能があるわけではない。名前が適切ではないかもしれない。