Golang中的线程池,处理等待状态的Goroutine

soat7uwm  于 12个月前  发布在  Go
关注(0)|答案(1)|浏览(103)

我想限制创建的goroutine的最大数量,以避免创建太多的goroutine。我们可以通过使用下面的东西来实现同样的目的:

var g errgroup.Group
g.SetLimit(10)
for i := 0; i < 1000000; i++ {
    i := i
    g.Go(func() error {
        task(i) //long running task with I/O
        return nil
    })
}
g.Wait()

字符串
我在上面创建了一个10个goroutine的限制。下一个goroutine(也就是第11个)只有在前10个goroutine中的一个完成任务时才会运行。但是我希望第11个goroutine也能在任何goroutine进入等待状态时运行。
我怎么能在这里做到这一点?

iyzzxitl

iyzzxitl1#

如果你想限制整个程序的线程数量,那么设置GOMAXPROCS是正确的。但是,如果你想限制程序某个部分的并发,那么你可以产生特定数量的worker,然后使用通道与它们通信。
下面是一个示例:

package main

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

const maxWorkers = 3

func worker(inputChannel <-chan int, outputChannel chan<- int, wg *sync.WaitGroup) {
    for val := range inputChannel {
        fmt.Printf("Working with %d\n", val)
        time.Sleep(2 * time.Second)
        outputChannel <- val + 1
    }
    wg.Done()
}

func main() {
    workerChannel := make(chan int)
    outputChannel := make(chan int)
    wg := &sync.WaitGroup{}
    //Spawn workers
    for i := 0; i < maxWorkers; i++ {
        wg.Add(1)
        go worker(workerChannel, outputChannel, wg)
    }
    //Assign work
    go func() {
        for i := 0; i < 10; i++ {
            workerChannel <- i
        }
        close(workerChannel)
    }()
    //Close the output channel when the work is done
    go func() {
        wg.Wait()
        close(outputChannel)
    }()
    //Wait for output
    for res := range outputChannel {
        fmt.Printf("Got result %d\n", res)
    }
}

字符串
希望这有帮助!

相关问题