經過昨天的大戰,油達大師與玉面飛鷹都放假休息一天.
今天介紹一下利用前面探討的channel, sync建立一個
分工合作的框架,以後可以據此框架,來使用goroutine
進行分工合作,以提高效能.
裡面使用亂數sleep來模擬實際工作各自進度不同的情境,
實際使用時,把那段改成相對應的工作.
直接來看例子吧.
// hello77
package main
import (
"fmt"
"math/rand"
"sync"
"time"
)
const (
numberGoroutines = 4
taskLoad = 10
)
var (
taskarray = [...]string{
"砍柴", "喂雞", "遛狗", "掃地",
"生火", "洗菜", "掃地", "煮飯",
"炒菜", "洗衣",
}
wg sync.WaitGroup
)
func init() {
rand.Seed(time.Now().Unix())
}
func main() {
tasks := make(chan string, taskLoad)
wg.Add(numberGoroutines)
for gr := 1; gr <= numberGoroutines; gr++ {
go worker(tasks, gr)
}
for _, task := range taskarray {
tasks <- task
}
close(tasks)
wg.Wait()
}
func worker(tasks chan string, worker int) {
defer wg.Done()
for {
mytask, ok := <-tasks
if !ok {
fmt.Printf("Worker#%d : 沒有新工作了,來溜!\n", worker)
return
}
fmt.Printf("Worker#%d : 開始 %s\n", worker, mytask)
sleep := rand.Int63n(100)
time.Sleep(time.Duration(sleep) * time.Millisecond)
fmt.Printf("Worker#%d : 完成 %s\n", worker, mytask)
}
}
執行結果:
./hello77
Worker#1 : 開始 砍柴
Worker#2 : 開始 喂雞
Worker#3 : 開始 遛狗
Worker#4 : 開始 掃地
Worker#4 : 完成 掃地
Worker#4 : 開始 生火
Worker#2 : 完成 喂雞
Worker#2 : 開始 洗菜
Worker#3 : 完成 遛狗
Worker#3 : 開始 掃地
Worker#1 : 完成 砍柴
Worker#1 : 開始 煮飯
Worker#4 : 完成 生火
Worker#4 : 開始 炒菜
Worker#2 : 完成 洗菜
Worker#2 : 開始 洗衣
Worker#3 : 完成 掃地
Worker#3 : 沒有新工作了,來溜!
Worker#1 : 完成 煮飯
Worker#1 : 沒有新工作了,來溜!
Worker#4 : 完成 炒菜
Worker#4 : 沒有新工作了,來溜!
Worker#2 : 完成 洗衣
Worker#2 : 沒有新工作了,來溜!
大家都完成工作了!