File tree Expand file tree Collapse file tree 3 files changed +108
-1
lines changed
Expand file tree Collapse file tree 3 files changed +108
-1
lines changed Original file line number Diff line number Diff line change 1+ # type Finish
2+ 特定のgorotineから、全部のgoroutineを完了させるためのモジュールです。
3+ Missionの軽量版で、完了通知に特化した機能のみを有します。
4+ Doneを持たせたgoroutine全てに対して、どこかのgoroutineから一度に完了を通知することができます。
5+
6+ context.Contextで同様のことを行う場合、Doneの活用されかたによってpanicする問題があります。
7+ Doneは上記問題を解決しつつ、goroutineの完了通知処理だけに特化したモジュールです。
8+
9+ go標準のcontext.Contextとの違いは以下の通り
10+ * 複数の箇所から完了通知が可能
11+ * 完了通知以外の機能を有さない
12+
13+ ## import
14+ ``` go
15+ import " github.com/l4go/task"
16+ ```
17+ vendoringして使うことを推奨します。
18+
19+ ## 機能の概略
20+ Finishが、提供する機能です。
21+
22+ 1 . Done()メソッドで、全てのDone待ちに完了を通知します。
23+ 1 . 完了の通知をRecvDone()で受け取って、処理の完了を実装できるようにしています。
24+ * なお、受け取った側の処理の完了を通知元のgoroutineで待ちたい場合は、より高機能な[task.Mission](./Mission.md) を用いる必要があります
25+
26+ sync.WaitGroupでは、生成タスク数が未定の場合、複数タスク生成完了前に生成済みタスクがすべて完了すると、間違った完了通知が起こる問題があります。
27+ この問題への対策が、子供のタスク完了の通知を遅延する機能です。
28+
29+ ## 利用サンプル
30+ 複数のworkerがある構造のgoroutineに完了処理を実装したコードサンプルです。
31+
32+ [ example] ( ../examples/ex_finish/ex_finish.go )
33+
34+ ## メソッド概略
35+
36+ ### func NewFinish() \* Finish
37+
38+ Finishを生成します。
39+
40+ ### func (f \* Finish) Done()
41+
42+ 完了を通知します。
43+
44+ ### func (f \* Finish) RecvDone() <-chan struct{}
45+
46+ 完了を通知するchannelを取得します。
47+
48+ ### func (f \* Finish) AsContext() \* context.Context
49+
50+ Finishをgo標準のcontext\. Contextインタフェース互換形式に変換します。
Original file line number Diff line number Diff line change 33goroutineの処理(task)の管理を支援するモジュール群です。
44
55* [ task.Mission] ( Mission.md )
6- * 親子関係のあるgoroutine群の終了管理を 、簡素かつ柔軟に行うためのモジュールです。
6+ * 親子関係のあるgoroutine群の完了管理を 、簡素かつ柔軟に行うためのモジュールです。
77* [ task.Cancel] ( Cancel.md )
88 * 1つのgoroutineから、複数のgoroutineのキャンセルを行うためのモジュールです。
9+ * [ task.Finish] ( Finish.md )
10+ * 1つのgoroutineから、複数のgoroutineの完了を行うためのモジュールです。
911* [ task.Pool] ( Pool.md )
1012 * goroutine pool(thread poolのgoroutine版)を実装するモジュールです。
1113
1214# type task.Canceller interface
1315task.Cancelおよびtask.Missionのキャンセル機能のみを取り出した互換コード用のinterface(task.Cancelおよびtask.Missionから変換可能)
1416
17+ # type task.Finisher interface
18+ task.Finishおよびtask.Missionの完了機能のみを取り出した互換コード用のinterface(task.Finishおよびtask.Missionから変換可能)
19+
1520# func task.IsCanceled(cc task.Canceller) bool
1621キャンセルの有無を確認します。task.Cancelおよびtask.Missionの両方に利用できます。
1722処理を開始する前に実施の判断をしたい時に利用します。
Original file line number Diff line number Diff line change 1+ package main
2+
3+ import (
4+ "log"
5+ "time"
6+
7+ "github.com/l4go/task"
8+ "github.com/l4go/timer"
9+ )
10+
11+ const (
12+ WORKERS = 3
13+ )
14+
15+ func main () {
16+ log .Println ("START boss" )
17+ defer log .Println ("END boss" )
18+
19+ f := task .NewFinish ()
20+
21+ w := WORKERS
22+ for w > 0 {
23+ go worker (f )
24+ w --
25+ }
26+
27+ select {
28+ case <- f .RecvDone ():
29+ log .Println ("Got 'done' from worker!!" )
30+ }
31+ tm := timer .NewTimer ()
32+ defer tm .Stop ()
33+ tm .Start (time .Second * 3 )
34+ <- tm .Recv ()
35+ }
36+
37+ func worker (f task.Finisher ) {
38+ log .Println ("START worker" )
39+ defer log .Println ("END worker" )
40+
41+ tm := timer .NewTimer ()
42+ defer tm .Stop ()
43+ tm .Start (time .Second * 3 )
44+ select {
45+ case <- f .RecvDone ():
46+ log .Println ("Got 'done' from other one!!" )
47+ return
48+ case <- tm .Recv ():
49+ log .Println ("Worked!!" )
50+ }
51+ f .Done ()
52+ }
You can’t perform that action at this time.
0 commit comments