1.what's goroutine pool
當我們有大量任務需要處理的時候,不想一下子起太多goroutine影響主機性能。這時需要控制goroutine的總並發數。
2.Example
1.定義接口體
Pool : 定義goroutine相關控制參數
Job:根據應用場景傳入需要處理的對象
Work:加工處理Job對象
2.定義任務處理方法
package main
import (
"fmt"
"github.com/labstack/gommon/log"
"time"
)
type Pool struct {
JobQueue chan Job // 帶處理的任務數據
WorkerCurrentNum int // 當前工作的協程數
MaxWorker int // 最大工作協程數
Result chan bool
FinishCallBack func() error
}
type Job struct{
ID int
}
type Worker struct {
Result chan bool
}
func (w *Worker) DoJob(job Job){
fmt.Println(job.ID)
time.Sleep(time.Second * 3)
w.Result <- true
}
func (g *Pool) SetFinishCallBack(f func() error) {
g.FinishCallBack = f
}
// 往Job任務隊列里面放入待處理的job
func (g *Pool) AddJob(job Job) {
g.JobQueue <- job
}
// 開啟協程池
func (g *Pool) Run() {
go g.stop()
for {
if g.WorkerCurrentNum < g.MaxWorker {
select {
case job, ok := <-g.JobQueue:
if ok {
worker := &Worker{g.Result}
go worker.DoJob(job)
g.WorkerCurrentNum ++
}else{
log.Info("goroutine pool over")
return
}
}
}
}
}
func (g *Pool) stop(){
for {
<- g.Result
g.WorkerCurrentNum --
}
}
func main() {
jobQueue := make(chan Job)
resultQueue := make(chan bool)
p := &Pool{
MaxWorker: 5,
JobQueue: jobQueue,
Result: resultQueue,
}
go func (){
for i:=0; i<100;i++{
job := Job{i}
p.AddJob(job)
}
close(p.JobQueue)
}()
p.Run()
}
