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 し、その後 Environment を Cancel するシグナルハンドラーが設定されている。
env.Wait() とはなにか
Environmentに対してStop()またはCancel()が呼ばれるのを待つGo()で立ち上げられた goroutine が全部完了する(呼び出した関数が戻り値を返す)のを待つ- 念のため
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 を強制的に止めるといった機能があるわけではない。名前が適切ではないかもしれない。