猿问

如何动态决定处理任务的 goroutines 数量

我写了一个虚拟代码来演示目的。

代码中有 2 个通道和 3 个协程。

1 goroutine 正在根据它们是否可以被 100 整除而没有余数来生成数字:

  • 如果数字可以被 100 整除,则将其推送到第一个通道。

  • 否则它会将它推到第二个通道。

2 个 goroutines 是这些通道的消费者:

  • 1 个 goroutine 负责处理数字 1...99 - 101...199 等。

  • 其他 goroutine 负责 100、200、300 等。

现在很明显,一个协程比另一个协程多 99 倍的工作要做。这在 Go 中是如何处理的?如果一个 goroutine 比其他 goroutine 工作得更多,这个 goroutine 是否有更多的 CPU 时间?还是我应该处理这种情况,例如为资源消耗量更大的频道创建 99 个 goroutine?(为了争论,这些工作被认为是相同的)

func main() {

    ch1 := make(chan int)

    ch2 := make(chan int)


    go generator(ch1, ch2)

    go handler(ch1)

    go handler2(ch2)


    time.Sleep(1*time.Second)

}


func generator(chan1, chan2 chan int){

    for i:=0 ; ; i++{

        if i%100 == 0{

            chan1 <- i

        }else{

            chan2 <- i

        }

    }

}


func handler(number chan int){

    for _ = range number{

        num := <- number

        fmt.Println("Number divided by 100 is 0. ", num)

    }

}


func handler2(number chan int){

    for _ = range number{

        num := <- number

        fmt.Println("Number divided by 100 is not 0. ", num)

    }

}


万千封印
浏览 126回答 2
2回答

largeQ

goroutine 获得多少 CPU 资源取决于很多因素。我们一般可以说的是,仅处理可被 100 整除的数字的 goroutine 很可能比另一个 goroutine 等待更多。你不应该担心这一点,等待通道上的元素不需要 CPU 资源,所以如果你有“足够”的其他 goroutines 有工作要做,他们可以利用你的 CPU。由于显而易见的原因,您的示例很简单,但在现实生活中,将您的任务抽象为一般任务(例如,处理任何数字都可能是一项任务)、创建和使用一般工作池并发送所有任务会更有利可图执行到池中。这样,无论池中有多少 goroutine,如果有工作要做并且有空闲(等待)goroutine,它将承担任务,尽可能利用您的 CPU 资源。作业处理器(执行者)应该知道如何处理数字是100或101。

冉冉说

如果没有任何内容可供ch2阅读,handler2则什么也不做。同时,handler1忙于处理它从中读取的内容&nbsp;ch1。这会消耗更多的 CPU 时间。从启动三个 Goroutine 到数据在通道上可用需要多长时间会很有趣。有可能generator之前已经完成了所有工作handler1并handler2准备好从通道中读取。在这种情况下,handler2将很快完成其工作,同时handler1还有工作要做。您当然可以创建更多 Goroutines,它们handler1将以一种循环方式处理数据。根据工作的性质,这可能会提高或降低整体性能。顺便说一句,generator应该在一切都写完的时候。closech1ch2
随时随地看视频慕课网APP

相关分类

Go
我要回答