这让我很头疼,我不知道如何解决它;我想要并行运行固定数量的 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,如果该通道已关闭,则退出该功能。另一种选择是为每个工人使用单独的退出渠道。
- 2 回答
- 0 关注
- 195 浏览
添加回答
举报
0/150
提交
取消