代碼倉庫
goroutine-pool
golang的協(xié)程管理
golang協(xié)程機制很方便的解決了并發(fā)編程的問題,但是協(xié)程并不是沒有開銷的,所以也需要適當(dāng)限制一下數(shù)量。
不使用協(xié)程池的代碼(示例代碼使用chan實現(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
}
需要實現(xiàn)的需求有兩個:
限制最大協(xié)程數(shù),本例為4
等待所有協(xié)程完成,本例為bytes切片長度
使用協(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行代碼實現(xiàn)通用協(xié)程池,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
您可能感興趣的文章:- golang協(xié)程池模擬實現(xiàn)群發(fā)郵件功能
- golang協(xié)程池設(shè)計詳解
- GO實現(xiàn)協(xié)程池管理的方法