go控制并发数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | package main import ( "fmt" "log" "sync" "time" ) type Glimit struct { n int c chan struct {} } // 初始化Glimit结构体 func New_workers(max_goroutine int) (*Glimit, error) { if max_goroutine <= 0 { return nil, fmt.Errorf( "max_goroutine must be greater than 0" ) } return &Glimit{ n: max_goroutine, c: make( chan struct {}, max_goroutine), }, nil } // 在限制内运行f函数 func (g *Glimit) Run(f func () error) { wg.Add(1) g.c <- struct {}{} // 阻塞直到有空闲槽位 go func () { defer func () { if r := recover(); r != nil { log.Printf( "panic occurred in goroutine with msg : %v" , r) } //log.Println(`通道被释放`) <-g.c wg.Done() }() if err := f(); err != nil { log.Printf( "Function execution failed with error: %v" , err) } }() } var wg = sync.WaitGroup{} func main() { number := 8 g, err := New_workers(3) // 定义一次最多使用3个并发 if err != nil { log.Fatalf( "Failed to initialize Glimit: %v" , err) } for i := 0; i < number; i++ { value := i // value只在for循环体里有效 // 在循环里定义每次要执行的函数 goFunc := func () error { // 做一些业务逻辑处理 log.Printf( " %v go func: %d \n" , time.Now(), value) // time.Sleep(time.Second) // 模拟一个可能发生的错误 if value == 5 { return fmt.Errorf( "simulated error at value: %d" , value) //panic(fmt.Errorf("simulated error at value: %d", value)) } return nil } g.Run(goFunc) } wg.Wait() // 等待结束 log.Println( "ALL DONE!" ) } |
优化后的代码
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!