goroutine 限流

goroutine 虽好,有时候使用过当也会造成 goroutine 泄露问题,semalib 的作用是用来控制并发 goroutine 的个数, 这在 for 循环里使用 goroutine 时特别管用。

使用方式如下:

// 构造一个并发 3 个 goroutine 的 sema
sema := semalib.New(3)
for i := 0; i < 10; i++ {
    sema.Acquire() // 数量不足,阻塞等待
    go func() {
        defer sema.Release()
        time.Sleep(time.Second)
    }()
}
// 等待所有的 goroutine 任务执行结束
sema.Wait()

0.1. 有错误时提前结束

// 构造一个并发 3 个 goroutine 的 sema
sema := semalib.New(3)
for i := 0; i < 10; i++ {
    sema.Add(func() error {
        err := dosomething()
        if err != nil {
            return err
        }   
        return nil
    })
}
// 等待所有的 goroutine 任务执行结束或者有错误时结束
err := sema.Wait()

results matching ""

    No results matching ""