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 を強制的に止めるといった機能があるわけではない。名前が適切ではないかもしれない。