任意のgoroutineから、任意の1つ以上のgoroutineのキャンセルを行うためのモジュールです。
Missionの軽量版で、キャンセルに特化した機能のみを有します。
Cancelを持たせたgoroutine全てに対して、どこかのgoroutineに一度にキャンセルすることができます。
context.Contextで同様のことを行う場合、Cancelの活用されかたによってpanicする問題があります。
Cancelは上記問題を解決しつつ、goroutineキャンセル処理だけに特化したモジュールです。
go標準のcontext.Contextとの違いは以下の通り
- 複数の箇所からキャンセルが可能
- キャンセル以外の機能を有さない
import "github.com/l4go/task"
vendoringして使うことを推奨します。
Cancelが、提供する機能です。
- Cancel()メソッドで、全てのCancelにキャンセルを通知します。
- キャンセル通知をRecvCancel()で受け取って、しょrいの中断を実装できるようにしています。
sync.WaitGroupでは、生成タスク数が未定の場合、複数タスク生成完了前に生成済みタスクがすべて終了すると、間違った完了通知が起こる問題があります。
この問題への対策が、子供のタスク終了の通知を遅延する機能です。
workerと、その子worker(sub_worker
)がある構造へ、goroutineにキャンセル処理を実装したコードサンプルです。
Cancelを生成します。
キャンセル情報を設定します。
キャンセルを通知するchannelを取得します。
Missionをgo標準のcontext.Contextインタフェース互換形式に変換します。