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!")
 
}

  优化后的代码

posted @   wsh3166Sir  阅读(175)  评论(7编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示