这是一个单一生产者,多消费者的模型。该模型主要实现了任务调度和同步。 实际使用时需要修改的内容如下:
type Task struct{} //自己实际需要的数据结构
producer() //实际生产数据逻辑
consumer() //实际处理逻辑
main()中的consumerNum(消费者个数), channelLen(通道长度)也可根据实际需要修改
代码如下:
package main
import (
"fmt"
"sync"
)
type Task struct {
Data string
}
var wg sync.WaitGroup
//生产逻辑
func producer(tasks chan Task) {
t := Task{}
for i := 62; i < 72; i++ {
t.Data = string(i)
tasks <- t
}
}
func producerDispatch(tasks chan Task) {
defer close(tasks)
producer(tasks)
}
//消费数据处理逻辑
func consumer(task Task) {
fmt.Printf("consum task:%v\n", task)
}
func consumerDispatch(tasks chan Task) {
defer wg.Done()
for task := range tasks {
consumer(task)
}
}
func main() {
//消费者个数
var consumerNum = 10
var channelLen = 50
tasks := make(chan Task, channelLen)
go producerDispatch(tasks)
for i := 0; i < consumerNum; i++ {
wg.Add(1)
go consumerDispatch(tasks)
}
wg.Wait()
fmt.Println("all done")
}
说明:
不足: 刚学习go, 没想到如何将其封成一个类似php的class的东西,方便使用。也许interface是条路? 有好思路的同学欢迎交流。