Go 控制协程(goroutine)的并发数量
    		       		warning:
    		            这篇文章距离上次修改已过445天,其中的内容可能已经有所变动。
    		        
        		                
                在Go中,可以使用runtime包中的GOMAXPROCS函数来设置程序可以使用的处理器核心数。但是,这并不能控制协程的并发数量。控制协程并发的数量,通常使用sync.WaitGroup或者通道(channel)来实现。
以下是一个使用通道来控制协程并发数量的示例代码:
package main
 
import (
    "fmt"
    "sync"
    "sync/atomic"
    "time"
)
 
var (
    concurrency = 5 // 最大并发数
    limit       = make(chan struct{}, concurrency) // 通道限制并发数
    wg          sync.WaitGroup
    count       int32 // 原子操作计数
)
 
func worker(id int) {
    defer wg.Done()
    // 添加到通道,开始工作
    limit <- struct{}{}
    
    // 模拟工作时间
    time.Sleep(1 * time.Second)
    
    // 打印信息
    fmt.Printf("Worker %d done\n", id)
    
    // 工作完成,从通道移除
    <-limit
    
    // 原子操作增加计数
    atomic.AddInt32(&count, 1)
}
 
func main() {
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go worker(i)
    }
    
    wg.Wait() // 等待所有工作结束
    
    fmt.Printf("Finished with %d workers\n", count)
}在这个例子中,我们创建了一个大小为concurrency的通道limit,用来控制同时执行的协程数量。每个工作协程在通过limit之前会被阻塞,当通道中已经有concurrency数量的项时,更多的协程会处于等待状态。每个工作协程完成后,会从通道中移除一个项,这样其他等待的协程就可以开始工作了。
这个例子中,我们限制了最大并发数为5,并且等待所有工作协程完成后,打印出最终完成的工作数量。
评论已关闭