Go語言協程數目控制

  • 1465
  • 0

Go语言有天生良好的多并发特征,依赖goroutines可以很好的实现多并发功能。但是,在多并发之下,控制goroutines的数量,也是需要考虑的问题。如果不限制goroutines,在较大量的goroutines影响下可能会消耗较多的CPU单元、内存、磁盘IO和网络性能。

Go语言有天生良好的多并发特征,依赖goroutines可以很好的实现多并发功能。但是,在多并发之下,控制goroutines的数量,也是需要考虑的问题。如果不限制goroutines,在较大量的goroutines影响下可能会消耗较多的CPU单元、内存、磁盘IO和网络性能。
 
控制的方法也很简单,可以通过channal方式限制。如下例:
 
func main() {
    var wg sync.WaitGroup
    // 生成token
    tokens := make(chan int, 5)

    for i := 0; i < 20; i++ {
        // 获取
        tokens <- 1
        wg.Add(1)
        go func() {
            time.Sleep(1000 * time.Millisecond)
            fmt.Println("go is here!")
            // 缴回
            <-tokens
            defer wg.Done()
        }()
    }
    wg.Wait()
}

 

 
则可以比较好的控制运行,除此之外,也可以更简单的使用CPU单元来限制,只需要替换一句:
tokens := make(chan int, runtime.NumCPU())

 

 

 

 

------------------------------

文章的授權使用CC BY-ND2.5協議。凡是標示“轉載”的文章,均來源於網絡並儘可能標註作者。如果有侵犯您的權益,請及時聯繫刪除或者署名、授權。


Gtalk/Email: cmd4shell  [at]  gmail.com