網(wǎng)站建設(shè)步驟實(shí)踐報(bào)告廣州市新聞最新消息
文章目錄
- channel+waitGroup控制并發(fā)量
- 前言
- 示例
channel+waitGroup控制并發(fā)量
前言
- golang的goroutine非常輕量級(jí),同時(shí)啟動(dòng)數(shù)萬協(xié)程都沒問題。
- 如果不對(duì)并發(fā)量進(jìn)行控制,比如同時(shí)產(chǎn)生數(shù)百萬的協(xié)程,會(huì)壓垮服務(wù)器
- 通過控制channel緩沖區(qū)的大小,從而控制并發(fā)數(shù)
- waitGroup保證子協(xié)程都運(yùn)行完成后主協(xié)程才退出
示例
產(chǎn)生了100個(gè)協(xié)程,控制并發(fā)數(shù)為10,可以看到用時(shí)10098ms
package mainimport ("fmt""sync""time"
)// channel + WaitGroup實(shí)現(xiàn)控制并發(fā)數(shù)量
var maxConcurrentNum = 10var chData = make(chan int, maxConcurrentNum)
var wg sync.WaitGroup
var taskNum = 100func main() {start_time := time.Now().UnixMilli()for i := 0; i < taskNum; i++ {chData <- 1go doTask(i)}wg.Wait()close(chData)fmt.Println("Main over")end_time := time.Now().UnixMilli()fmt.Printf("Duration: %vms", end_time-start_time)
}
func doTask(taskID int) {wg.Add(1)time.Sleep(time.Millisecond * 1000)fmt.Println("Finish task ", taskID)<-chDatawg.Done()
}
調(diào)整并發(fā)數(shù)為50時(shí),用時(shí)2032ms