基於生產者-消費者的設計。
任務數據結構 Task 自帶方法 exec() 負責執行Task任務的任意函數 f(),Pool的run()開啓N個消費者協程監聽共享無緩衝channel,生產者協程封裝數據id和函數t到數據結構Task,導入channel執行。
package main
import (
"fmt"
"time"
"math/rand"
)
type Task struct {
ProducerId int
TaskId int
f func() time.Time
}
func NewTask(id int, taskid int,f func() time.Time) *Task {
return &Task{
ProducerId: id,
TaskId: taskid,
f: f,
}
}
type Pool struct {
workerNum int
workerChan chan *Task
}
func NewPool(num int) *Pool {
return &Pool{
workerNum: num,
workerChan: make(chan *Task),
}
}
func (p *Pool) worker(id int) {
for task := range p.workerChan {
fmt.Println(task.f(),": ConsumerId:", id, "ProducerId:", task.ProducerId, "TaskId:", task.TaskId,"is done")
}
}
func (p *Pool) Run() {
for i := 0; i < p.workerNum; i++ {
go p.worker(i)
}
}
func task() time.Time {
return time.Now()
}
func main() {
p := NewPool(10)
p.Run()
for producerId :=0; producerId < 15; producerId++ {
go func(producerId int){
for i := 0; i < 50; i++ {
p.workerChan<-NewTask(producerId,rand.Int(),task)
}
}(producerId)
}
time.Sleep(3*time.Second)
}