为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
万千封印 2023-06-05 18:23:24
我写了一个虚拟代码来演示目的。代码中有 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)    }}
查看完整描述

2 回答

?
largeQ

TA贡献2039条经验 获得超7个赞

goroutine 获得多少 CPU 资源取决于很多因素。

我们一般可以说的是,仅处理可被 100 整除的数字的 goroutine 很可能比另一个 goroutine 等待更多。你不应该担心这一点,等待通道上的元素不需要 CPU 资源,所以如果你有“足够”的其他 goroutines 有工作要做,他们可以利用你的 CPU。

由于显而易见的原因,您的示例很简单,但在现实生活中,将您的任务抽象为一般任务(例如,处理任何数字都可能是一项任务)、创建和使用一般工作池并发送所有任务会更有利可图执行到池中。这样,无论池中有多少 goroutine,如果有工作要做并且有空闲(等待)goroutine,它将承担任务,尽可能利用您的 CPU 资源。作业处理器(执行者)应该知道如何处理数字是100101

查看完整回答
反对 回复 2023-06-05
?
冉冉说

TA贡献1877条经验 获得超1个赞

如果没有任何内容可供ch2阅读,handler2则什么也不做。同时,handler1忙于处理它从中读取的内容 ch1。这会消耗更多的 CPU 时间。

从启动三个 Goroutine 到数据在通道上可用需要多长时间会很有趣。有可能generator之前已经完成了所有工作handler1handler2准备好从通道中读取。在这种情况下,handler2将很快完成其工作,同时handler1还有工作要做。

您当然可以创建更多 Goroutines,它们handler1将以一种循环方式处理数据。根据工作的性质,这可能会提高或降低整体性能。

顺便说一句,generator应该在一切都写完的时候。closech1ch2


查看完整回答
反对 回复 2023-06-05
  • 2 回答
  • 0 关注
  • 125 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信