代码中有2个通道和3个goroutine.
1 goroutine根据它们是否可被100整除而没有余数来生成数字:
>如果数字可被100整除,则将其推送到第一个通道.
>否则将其推送到第二个频道.
2 goroutines是这些渠道的消费者:
> 1 goroutine负责消耗数字1 … 99 – 101 … 199等
>其他goroutine负责100,200,300等.
很明显,一个goroutine比另一个goroutine要多做99倍的工作.
怎么在Go处理?如果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) } }
解决方法
我们通常可以说的是,仅处理可分数为100的数字的goroutine很可能比其他数字等待更多.您不必担心这一点,等待通道上的元素不需要cpu资源,因此如果您有足够的“其他”goroutine可以执行作业,它们可以利用您的cpu.
出于显而易见的原因,您的示例很简单,但在现实生活中,将任务抽象为常规任务(例如,处理任何数字可能是一项任务),创建和使用常规工作池以及发送所有任务会更有利可图执行到池.这样,无论池有多少goroutine,如果有工作要做并且有一个免费(等待)goroutine,它将承担任务,尽可能地利用你的cpu资源.作业处理器(执行者)应该知道如何处理100或101的数字.
有关如何实现此类goroutine池的示例,请参阅Is this an idiomatic worker thread pool in Go?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。