先啟動固定數量的goroutine,每個goroutine都在從channel中獲取資料,如果這個channel為空,就阻塞等待在那里
channel中傳遞一個Car型別,這個型別主要負責具體做的任務
也就是channel就是運輸通道,在這個通道上傳遞Car這樣一個汽車,來一輛車就處理這輛車的作業,沒有車過來那這些工人就在那等著
package mainimport ( "log" "sync" "time")type Pool struct { workerNum int road chan *Car wg sync.WaitGroup}//初始化這個物件func NewPool(wn int) *Pool { return &Pool{workerNum: wn, road: make(chan *Car)}}//往channel添加具體任務func (p *Pool) AddCar(f *Car) { p.road <- f}//goroutine去作業func (p *Pool) work(workId int) { for f := range p.road { log.Println("workId:", workId, "start") f.do() log.Println("workId:", workId, "done") } p.wg.Done()}//創建goroutine等著接作業func (p *Pool) Run() { for i := 0; i < p.workerNum; i++ { go p.work(i) p.wg.Add(1) } p.wg.Wait()}func (p *Pool) colse() { close(p.road)}func main() { pool := NewPool(5) go func() { //模擬要做10件事 for i := 0; i < 10; i++ { car := Car{ param: i, } pool.AddCar(&car) } pool.colse() }() pool.Run()}/*具體做的事通過這個來傳遞*/type Car struct { param int}func (c *Car) do() error { log.Println(time.Now(), c.param) return nil}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/59787.html
標籤:Go
上一篇:[Go] 分頁計算頁碼的主要邏輯
