golang 40行代碼實現(xiàn)通用協(xié)程池
代碼倉庫
golang的協(xié)程管理
golang協(xié)程機制很方便的解決了并發(fā)編程的問題,但是協(xié)程并不是沒有開銷的,所以也需要適當限制一下數(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ū)別是只需要關注業(yè)務邏輯即可,并發(fā)控制和等待都已經(jīng)被協(xié)程池接管
總結
以上所述是小編給大家介紹的golang 40行代碼實現(xiàn)通用協(xié)程池,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關文章
golang結合mysql設置最大連接數(shù)和最大空閑連接數(shù)
本文介紹golang?中連接MySQL時,如何設置最大連接數(shù)和最大空閑連接數(shù),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02
并發(fā)安全本地化存儲go-cache讀寫鎖實現(xiàn)多協(xié)程并發(fā)訪問
這篇文章主要介紹了并發(fā)安全本地化存儲go-cache讀寫鎖實現(xiàn)多協(xié)程并發(fā)訪問,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-10-10
golang并發(fā)編程中Goroutine 協(xié)程的實現(xiàn)
Go語言中的協(xié)程是一種輕量級線程,通過在函數(shù)前加go關鍵字來并發(fā)執(zhí)行,具有動態(tài)棧、快速啟動和低內存使用等特點,本文就來詳細的介紹一下,感興趣的可以了解一下2024-10-10

