iT邦幫忙

DAY 25
0

蠻可愛的 Golang系列 第 25

分工合作

  • 分享至 

  • xImage
  •  

經過昨天的大戰,油達大師與玉面飛鷹都放假休息一天.
今天介紹一下利用前面探討的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 : 沒有新工作了,來溜!
大家都完成工作了!

上一篇
油達大師 vs 玉面飛鷹
下一篇
Golang也會畫SVG
系列文
蠻可愛的 Golang30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言