[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ǒ)

    すぐ理解できる人すごい
广告
将在 10 秒后关闭
bannerAds