如何利用conc库为每个函数单独配置Goroutine上限?
使用conc库为每个函数独立限制Goroutine数量
要实现每个函数最多运行10个Goroutine的需求,你可以为每个方法创建独立的conc.Pool实例,并分别设置最大并发数为10。conc库的Pool设计轻量,这种方式既能满足单独管控每个函数并发数的需求,也不会造成资源浪费。
以下是改造后的完整代码:
package main import ( "fmt" "github.com/sourcegraph/conc/pool" ) func main() { checkMethod1 := true checkMethod2 := false checkMethod3 := true list := []string{"info1", "info2", "info3", "info5"} // 为每个方法创建独立的Pool,设置最大并发数为10 pool1 := pool.New().WithMaxGoroutines(10) pool2 := pool.New().WithMaxGoroutines(10) pool3 := pool.New().WithMaxGoroutines(10) for _, value := range list { value := value if checkMethod1 { pool1.Go(func() { // 执行method1的业务逻辑,示例打印当前值 fmt.Printf("method1 processing: %s\n", value) }) } if checkMethod2 { pool2.Go(func() { fmt.Printf("method2 processing: %s\n", value) }) } if checkMethod3 { pool3.Go(func() { fmt.Printf("method3 processing: %s\n", value) }) } } // 等待对应Pool的所有任务完成 if checkMethod1 { pool1.Wait() } if checkMethod2 { pool2.Wait() } if checkMethod3 { pool3.Wait() } fmt.Println("All done") }
关键说明
- 独立Pool管控并发:每个方法对应一个Pool,通过
WithMaxGoroutines(10)限制该方法最多同时运行10个Goroutine,避免多个方法抢占并发资源。 - 任务提交与调度:使用
pool.Go()替代原生go func(),Pool会自动处理Goroutine的创建、复用和并发限制,无需手动管理通道或计数。 - 等待任务完成:必须调用每个Pool的
Wait()方法,确保主Goroutine等待所有子任务执行完毕后再退出,避免任务未完成就打印"All done"。根据开关判断是否等待,避免对未启用的Pool做无意义操作。
内容的提问来源于stack exchange,提问作者sheki meki
相关产品推荐
相关产品推荐

