Go语言小技巧(1)-控制并发数 - Go语言中文社区

Go语言小技巧(1)-控制并发数


Go语言小技巧(1)-控制并发数

需求

虽然goroutine很廉价,但是有时候还是希望控制goroutine并发数。

实现

来自K8S源代码

k8s.ioclient-goutilworkqueueparallelizer.go

type DoWorkPieceFunc func(piece int)

// Parallelize is a very simple framework that allow for parallelizing
// N independent pieces of work.

func Parallelize(workers, pieces int, doWorkPiece DoWorkPieceFunc) {
    toProcess := make(chan int, pieces)
    for i := 0; i < pieces; i++ {
        toProcess <- i
    }
    close(toProcess)

    if pieces < workers {
        workers = pieces
    }

    wg := sync.WaitGroup{}
    wg.Add(workers)
    for i := 0; i < workers; i++ {
        go func() {
            defer utilruntime.HandleCrash()
            defer wg.Done()
            for piece := range toProcess {
                doWorkPiece(piece)
            }
        }()
    }
    wg.Wait()
}

分析

  • workers: int, goroutine并发数
  • pieces: int, 任务总数
  • doWorkPiece: func(piece int),任务处理函数
  1. 将任务索引全部放入channel中;
  2. 通过for循环,创建worker个goroutine;
  3. 每个goroutine从channel中领取任务
版权声明:本文来源简书,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://www.jianshu.com/p/95540ab5becf
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-01-12 12:56:20
  • 阅读 ( 740 )
  • 分类:Go

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢