[Go语言][备忘录] 工作者模式
初学者理解并行处理的示例代码。
-
- 何かしらのタスクしたい処理があるとして
-
- 並列で行いたい
- そのやり方、理解に悶え苦しんだ結果の理解
package main
import (
"fmt"
"time"
)
// 影分身
func tProc(tasks []int) <-chan int {
tChan := make(chan int)
go func() {
defer close(tChan)
var value int
for _, v := range tasks {
value += v
}
time.Sleep(waitTime * time.Second)
tChan <- value
}()
return tChan
}
// 影分身を解除し本体に戻す
func tFanin(chanels []<-chan int) <-chan int {
sumChan := make(chan int)
fnin := func(c <-chan int) {
for {
v, ok := <-c
if !ok {
return
}
sumChan <- v
}
}
for _, c := range chanels {
go fnin(c)
}
return sumChan
}
// n体分の影分身の結果を出力し経験値を解放する
func allProc(stream <-chan int, count int) {
for i := 0; i < count; i++ {
fmt.Println(<-stream)
}
}
func startFanOutA() {
// two task
a := []int{1, 2, 3}
b := []int{4, 5, 6}
multitask := [][]int{a, b}
finders := make([]<-chan int, len(multitask))
// ワーカーそれぞれに多重影分身を行ってもらう。
for i, v := range multitask {
finders[i] = tProc(v)
}
faninStream := tFanin(finders)
allProc(faninStream, len(multitask))
}
const (
waitTime = 2
)
func FanOutSampleA() {
fmt.Println("start")
startFanOutA()
}
结果 (jié guǒ)
- すぐ理解できる人すごい