使用 Golang 的 goroutine 來進行排程,
透過建立緩衝區,等待 goroutine 來取得待處理的資料,
package main
import (
	"fmt"
	"math/rand"
	"sync"
	"time"
)
const (
	numberGoroutineList = 4
	numberTaskList      = 10
)
var wg sync.WaitGroup
func init() {
	rand.Seed(time.Now().Unix())
}
func main() {
	taskList := make(chan string, numberTaskList)
	wg.Add(numberGoroutineList)
	for gr := 1; gr <= numberGoroutineList; gr++ {
		go worker(taskList, gr)
	}
	for post := 1; post <= numberTaskList; post++ {
		taskList <- fmt.Sprintf("任務 : %d", post)
	}
	close(taskList)
	wg.Wait()
}
func worker(taskList chan string, worker int) {
	defer wg.Done()
	for {
		task, ok := <-taskList
		if !ok {
			fmt.Printf("工人: %d: 關閉\n", worker)
			return
		}
		fmt.Printf("工人: %d: 開始 %s\n", worker, task)
		sleep := rand.Int63n(100)
		time.Sleep(time.Duration(sleep) * time.Millisecond)
		fmt.Printf("工人: %d: 完成 %s\n", worker, task)
	}
}
taskList 是作為緩衝區,使用 make(chan string, 10) 產生go worker() 產生 goroutine 來進行作業
taskList <-  放進去通道中<-taskList 從通道中取出
AomaShinku:goroutine aomashinku$ go run main.go
工人: 4: 開始 任務 : 4
工人: 2: 開始 任務 : 1
工人: 3: 開始 任務 : 2
工人: 1: 開始 任務 : 3
工人: 3: 完成 任務 : 2
工人: 3: 開始 任務 : 5
工人: 1: 完成 任務 : 3
工人: 1: 開始 任務 : 6
工人: 2: 完成 任務 : 1
工人: 2: 開始 任務 : 7
工人: 4: 完成 任務 : 4
工人: 4: 開始 任務 : 8
工人: 1: 完成 任務 : 6
工人: 1: 開始 任務 : 9
工人: 3: 完成 任務 : 5
工人: 3: 開始 任務 : 10
工人: 4: 完成 任務 : 8
工人: 4: 關閉
工人: 1: 完成 任務 : 9
工人: 1: 關閉
工人: 2: 完成 任務 : 7
工人: 2: 關閉
工人: 3: 完成 任務 : 10
工人: 3: 關閉
AomaShinku:goroutine aomashinku$
完成用 goroutine 來處理資料