golang-并发数控制

用 sync.WaitGroup 和 channel 在一起实现

    ch := make(chan int, 10)
    var wg sync.WaitGroup
    for i:=0;i<10;i++{
        go func() {
            for i2 := range ch {
                fmt.Println("work start : ", i2)
                wg.Done()
            }
        }()
    }

    jobCount := 20
    for i:=0;i<jobCount;i++{
        ch<- 1
        wg.Add(1)
        fmt.Printf("job No.: %d gouroutine No.: %d\n", i, runtime.NumGoroutine() )
    }
    wg.Wait()

控制十个并发数,如果其中一个goutine有错误,就退出,但要执行完正在执行的任务。

func main() {
    consumer([]int{1, 2, 3, 4, 5, 6, 9, -11, 11, 12, 13, 14, 15, 16, 17, 18, 19, 10, -1})
}

func consumer(task []int) error {
    ch := make(chan int, 10)
    exitch := make(chan int)
    var wg sync.WaitGroup
    for i := 0; i < cap(10); i++ {
        go func() {
            for i := range ch {
                wg.Done()
                fmt.Println("Start task :", i)
                if err := handerFunc(i); err != nil {
                    exitch <- 1
                }

            }
        }()
    }
    for _, v := range task {
        flagexit := false
        select {
        case <-exitch:
            flagexit = true
        default:
            ch <- v
            wg.Add(1)
            fmt.Println("task queue :", v)
        }
        if flagexit {
            break
        }
    }

    wg.Wait()
    return nil
}
func handerFunc(v int) error {
    if v > 0 {
        return nil
    }
    return errors.New("error v <= 0")
}

Last updated

Was this helpful?