限制goroutine数量写法

虽然golang的goroutine可以开启无数个goroutine,但是没有限制也是不行的。我就写一下我对goroutine数量限制的写法

1、初始化goroutine协程池。把goroutine数量开启完毕

2、在池子中调用goroutine

package main

import (
    "fmt"
    "runtime"
    "time"
)

/*
主要逻辑
1、初始化一个工作池,并且定义要启动多少个goroutine的数量的channel
2、在这个池子里面,把数据加入到channel  这里用for循环
3、在具体的函数中的defer中把channel里面的数据去除掉
*/

var (
    ch=make(chan bool,100)
    c=3
)

//初始化工作池
func init(){
    for i:=0;i<c;i++{
        go Queu()
    }
}

func main(){
    fmt.Print("main")

    //获取一行的输入
    var input string
    fmt.Scanln(&input)
}


//在工作池中限制goroutine的数量
func Queu(){
    t:=time.NewTicker(time.Second)
    defer func(){
        t.Stop()
    }()

    for{
        select{
        case ch<-true:
            go test1()
        case <-t.C:
            test()
        }
    }

}

func test1(){
    defer func(){
        <-ch
    }()
    time.Sleep(time.Millisecond * 100)
}

func test(){
    fmt.Printf("%d====numGo
", runtime.NumGoroutine())
}

我的理解:限制goroutine的数量:

  就是通过channel的异步阻塞的特性来完成

上面的代码还不健壮,加上waitgroup以及锁,可以在不同的场景下适用

原文地址:https://www.cnblogs.com/pyrene/p/8916513.html