You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何利用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 21:47:31