代碼倉(cāng)庫(kù)
goroutine-pool
golang的協(xié)程管理
golang協(xié)程機(jī)制很方便的解決了并發(fā)編程的問(wèn)題,但是協(xié)程并不是沒(méi)有開(kāi)銷(xiāo)的,所以也需要適當(dāng)限制一下數(shù)量。
不使用協(xié)程池的代碼(示例代碼使用chan實(shí)現(xiàn),代碼略啰嗦)
func (p *converter) upload(bytes [][]byte) ([]string, error) {
ch := make(chan struct{}, 4)
wg := sync.WaitGroup{}
wg.Add(len(bytes))
ret := make([]string, len(bytes))
// 上傳
for index, item := range bytes {
ch - struct{}{}
go func(index int, imageData []byte) {
defer func() {
wg.Done()
-ch
}()
link, err := qiniu.UploadBinary(imageData, fmt.Sprintf("%d.png", time.Now().UnixNano()))
if err != nil {
log.Println("上傳圖片失敗", err.Error())
return
}
ret[index] = link
}(index, item)
}
wg.Wait()
return ret, nil
}
需要實(shí)現(xiàn)的需求有兩個(gè):
限制最大協(xié)程數(shù),本例為4
等待所有協(xié)程完成,本例為bytes切片長(zhǎng)度
使用協(xié)程池的代碼
func (p *converter) upload(bytes [][]byte) ([]string, error) {
ret := make([]string, len(bytes))
pool := goroutine_pool.New(4, len(bytes))
for index, item := range bytes {
index := index
item := item
pool.Submit(func() {
link, err := qiniu.UploadBinary(item, fmt.Sprintf("%d.png", time.Now().UnixNano()))
if err != nil {
log.Println("上傳圖片失敗", err.Error())
return
}
ret[index] = link
})
}
pool.Wait()
return ret, nil
}
可以看到最大的區(qū)別是只需要關(guān)注業(yè)務(wù)邏輯即可,并發(fā)控制和等待都已經(jīng)被協(xié)程池接管
總結(jié)
以上所述是小編給大家介紹的golang 40行代碼實(shí)現(xiàn)通用協(xié)程池,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
您可能感興趣的文章:- golang協(xié)程池模擬實(shí)現(xiàn)群發(fā)郵件功能
- golang協(xié)程池設(shè)計(jì)詳解
- GO實(shí)現(xiàn)協(xié)程池管理的方法