微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我写了一个虚拟代码来证明目的.

代码中有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)
    }
}

解决方法

goroutine获得多少cpu资源取决于很多东西.

我们通常可以说的是,仅处理可分数为100的数字的goroutine很可能比其他数字等待更多.您不必担心这一点,等待通道上的元素不需要cpu资源,因此如果您有足够的“其他”goroutine可以执行作业,它们可以利用您的cpu.

出于显而易见的原因,您的示例很简单,但在现实生活中,将任务抽象为常规任务(例如,处理任何数字可能是一项任务),创建和使用常规工作池以及发送所有任务会更有利可图执行到池.这样,无论池有多少goroutine,如果有工作要做并且有一个免费(等待)goroutine,它将承担任务,尽可能地利用你的cpu资源.作业处理器(执行者)应该知道如何处理100或101的数字.

有关如何实现此类goroutine池的示例,请参阅Is this an idiomatic worker thread pool in Go?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐