如何动态决定处理任务的goroutine数量
我写了一个虚拟代码来证明目的.
代码中有2个通道和3个goroutine. 1 goroutine根据它们是否可被100整除而没有余数来生成数字: >如果数字可被100整除,则将其推送到第一个通道. 2 goroutines是这些渠道的消费者: > 1 goroutine负责消耗数字1 … 99 – 101 … 199等 很明显,一个goroutine比另一个goroutine要多做99倍的工作. 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) } } 解决方法
goroutine获得多少CPU资源取决于很多东西.
我们通常可以说的是,仅处理可分数为100的数字的goroutine很可能比其他数字等待更多.您不必担心这一点,等待通道上的元素不需要CPU资源,因此如果您有足够的“其他”goroutine可以执行作业,它们可以利用您的CPU. 出于显而易见的原因,您的示例很简单,但在现实生活中,将任务抽象为常规任务(例如,处理任何数字可能是一项任务),创建和使用常规工作池以及发送所有任务会更有利可图执行到池.这样,无论池有多少goroutine,如果有工作要做并且有一个免费(等待)goroutine,它将承担任务,尽可能地利用你的CPU资源.作业处理器(执行者)应该知道如何处理100或101的数字. 有关如何实现此类goroutine池的示例,请参阅Is this an idiomatic worker thread pool in Go? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |