Golang之Buffer Channel的用法

{app.params.name}}{app.params.name}}{app.params.name}}

预设一个这样的场景

我要运行一个脚本 要一次运行多个 是并发的 但是我又想控制下并发量 不要太多

比如我一次要运行10个,但是最多运行3个创建能放10个脚本的变量jobs

jobs := make(chan int, 10)

go func() {
    for i := 0; i < 10; i++ {
        jobs <- i + 1
    }
    close(jobs)
}()

创建最多能运行3个脚本的变量

works := make(chan struct{}, 3)

开始运行脚本

for job := range jobs {
    wg.Add(1)
    go func(job, i int) {
        works <- struct{}{} // 达到3个 就会阻塞卡住 等待执行完释放才能继续
        fmt.Printf("脚本 id %2d 开始运行 \n", job)

        // 模拟脚本运行过程
        duration := time.Second * time.Duration(job)
        time.Sleep(duration)

        <-works
        wg.Done()
    }(job, 1)
}

输出结果展示下

$ go run main.go
脚本 id 10 开始运行 
脚本 id  1 开始运行 
脚本 id  2 开始运行 
脚本 id  6 开始运行 
脚本 id  5 开始运行 
脚本 id  8 开始运行 
脚本 id  9 开始运行 
脚本 id  4 开始运行 
脚本 id  3 开始运行 
脚本 id  7 开始运行

完整代码贴出来

package main

import (
    "fmt"
    "sync"
    "time"
)

func main() {
    jobs := make(chan int, 10)
    works := make(chan struct{}, 3)

    wg := sync.WaitGroup{}

    go func() {
        for i := 0; i < 10; i++ {
            jobs <- i + 1
        }
        close(jobs)
    }()

    for job := range jobs {
        wg.Add(1)
        go func(job, i int) {
            works <- struct{}{} // 达到3个 就会阻塞卡住 等待执行完释放才能继续
            fmt.Printf("脚本 id %2d 开始运行 \n", job)

            // 模拟脚本运行过程
            duration := time.Second * time.Duration(job)
            time.Sleep(duration)

            <-works
            wg.Done()
        }(job, 1)
    }

    wg.Wait()

}

 

版权声明

durban创作并维护的 小绒毛的足迹博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证。

本文首发于 博客( https://www.xiaorongmao.com ),版权所有,侵权必究。

本文永久链接: https://www.xiaorongmao.com/blog/162



版权声明

durban创作并维护的 小绒毛的足迹博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证。

本文首发于 小绒毛的足迹博客( https://www.xiaorongmao.com ),版权所有,侵权必究。

本文永久链接: https://www.xiaorongmao.com/blog/162