Skip to content

Commit 00b14e5

Browse files
committed
Updated docs.
1 parent b3ce2ba commit 00b14e5

File tree

3 files changed

+108
-1
lines changed

3 files changed

+108
-1
lines changed

docs/Finish.md

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
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インタフェース互換形式に変換します。

docs/README.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,20 @@
33
goroutineの処理(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
1315
task.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
処理を開始する前に実施の判断をしたい時に利用します。

examples/ex_finish/ex_finish.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
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+
}

0 commit comments

Comments
 (0)