如何根据文件描述符的数量限制go例程

How to limit go routines based on number of file descriptors

我有一个向 HTTP 服务器执行查询的程序,每个请求都有一个 goroutine。 我很快发现它对于 MacOS 来说太多了,因为文件描述符限制为 250。

我想知道我是否可以限制 goroutine 的数量,或者阻止直到有可用的 goroutine,而不是失败。

也许有 250 个 goroutines 的工作池,并将其余请求排队?

你有什么想法

package main

import "fmt"

const ROUTINE_LIMIT = 250

func main() {

    channelCounter := make(chan bool, ROUTINE_LIMIT)

    for {
        select {
        //will add till 250 after that it will block
        case channelCounter <- true:
            fmt.Println("added channel")
            go startRoutine(channelCounter)
        }
    }
}

func startRoutine(channelCounter chan bool) {
    /*
        do your stuff
    */

    //free the channel
    <-channelCounter
}

您可以使用频道限制您的 goruotine 数量。 一个记录 go 例程数量的通道 运行 .. 工作完成后,您可以读取通道值以减少计数。

上面的程序就像一个粗略的示例代码..(我认为它涵盖了总体思路)