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

处理来自具有固定数量工人的永无止境的队列的作业

处理来自具有固定数量工人的永无止境的队列的作业

Go
暮色呼如 2021-07-27 21:33:37
这让我很头疼,我不知道如何解决它;我想要并行运行固定数量的 N 个 goroutines从永无止境的队列中,我将获取有关要处理的作业的 X 消息我想让 N 个 goroutine 处理这些 X 个作业,一旦其中一个例程无事可做,我想从永无止境的队列中获取另一个 X 个作业下面答案中的代码(请参阅 url)可以出色地处理任务,但是一旦任务列表为空,工作人员就会死亡,我希望他们保持活动状态并以某种方式通知主代码他们无法工作,以便我可以获取更多作业以使用任务填充任务列表使用下面的 user:Jsor 示例代码,我尝试创建一个简单的程序,但我很困惑。import (    "fmt"    "strconv")//workChan - read only that delivers work//requestChan - ??? what is thisfunc Worker(myid string, workChan <- chan string, requestChan chan<- struct{}) {    for {        select {        case work := <-workChan:            fmt.Println("Channel: " + myid + " do some work: " + work)        case requestChan <- struct{}{}:            //hm? how is the requestChan used?        }    }}func Logic(){    workChan := make(chan string)    requestChan := make(chan struct{})    //Create the workers    for i:=1; i < 5; i++ {        Worker( strconv.Itoa( i), workChan, requestChan)    }    //Give the workers some work    for i:=100; i < 115; i++ {        workChan<- "workid"+strconv.Itoa( i)    }}
查看完整描述

2 回答

?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

这就是select声明的目的。


func Worker(workChan chan<- Work, requestChan chan<- struct{}) {

    for {

        select {

        case work := <-workChan:

            // Do work

        case requestChan <- struct{}{}:

        }

    }

}

这个工人将永远运行。如果工作可用,它将从工作线程中拉取它。如果什么都没有,它会发送一个请求。


不是因为它永远运行,如果你想杀死一个工人,你需要做其他事情。一种可能性是始终检查okworkChan,如果该通道已关闭,则退出该功能。另一种选择是为每个工人使用单独的退出渠道。


查看完整回答
反对 回复 2021-08-02
  • 2 回答
  • 0 关注
  • 195 浏览
慕课专栏
更多

添加回答

举报

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