国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Golang > 正文

golang 40行代碼實現通用協程池

2020-04-01 18:55:13
字體:
來源:轉載
供稿:網友

代碼倉庫

goroutine-pool

golang的協程管理

golang協程機制很方便的解決了并發編程的問題,但是協程并不是沒有開銷的,所以也需要適當限制一下數量。

不使用協程池的代碼(示例代碼使用chan實現,代碼略啰嗦)

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}

需要實現的需求有兩個:

限制最大協程數,本例為4

等待所有協程完成,本例為bytes切片長度

使用協程池的代碼

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}

可以看到最大的區別是只需要關注業務邏輯即可,并發控制和等待都已經被協程池接管

總結

以上所述是小編給大家介紹的golang 40行代碼實現通用協程池,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VEVB武林網網站的支持!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 朔州市| 江油市| 昌宁县| 中江县| 五原县| 元江| 桂林市| 楚雄市| 宜城市| 榆林市| 温州市| 南城县| 二连浩特市| 中超| 青海省| 郴州市| 苏尼特左旗| 定日县| 萍乡市| 宜兰县| 会泽县| 舟山市| 新邵县| 延长县| 瓮安县| 泗阳县| 苗栗市| 永城市| 凤山市| 达州市| 竹北市| 仁寿县| 富川| 黄陵县| 上虞市| 蒙阴县| 曲麻莱县| 无为县| 洪江市| 绩溪县| 洱源县|