加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 08:28:45 所属栏目:Java 来源:网络整理
导读:我写了一个虚拟代码来证明目的. 代码中有2个通道和3个goroutine. 1 goroutine根据它们是否可被100整除而没有余数来生成数字: 如果数字可被100整除,则将其推送到第一个通道. 否则将其推送到第二个频道. 2 goroutines是这些渠道的消费者: 1 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?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读