猿问

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

这让我很头疼,我不知道如何解决它;

  • 我想要并行运行固定数量的 N 个 goroutines

  • 从永无止境的队列中,我将获取有关要处理的作业的 X 消息

  • 我想让 N 个 goroutine 处理这些 X 个作业,一旦其中一个例程无事可做,我想从永无止境的队列中获取另一个 X 个作业

下面答案中的代码(请参阅 url)可以出色地处理任务,但是一旦任务列表为空,工作人员就会死亡,我希望他们保持活动状态并以某种方式通知主代码他们无法工作,以便我可以获取更多作业以使用任务填充任务列表

使用下面的 user:Jsor 示例代码,我尝试创建一个简单的程序,但我很困惑。


import (

    "fmt"

    "strconv"

)


//workChan - read only that delivers work

//requestChan - ??? what is this

func 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)

    }


}


暮色呼如
浏览 196回答 2
2回答

明月笑刀无情

这就是select声明的目的。func Worker(workChan chan<- Work, requestChan chan<- struct{}) {&nbsp; &nbsp; for {&nbsp; &nbsp; &nbsp; &nbsp; select {&nbsp; &nbsp; &nbsp; &nbsp; case work := <-workChan:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Do work&nbsp; &nbsp; &nbsp; &nbsp; case requestChan <- struct{}{}:&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}这个工人将永远运行。如果工作可用,它将从工作线程中拉取它。如果什么都没有,它会发送一个请求。不是因为它永远运行,如果你想杀死一个工人,你需要做其他事情。一种可能性是始终检查okworkChan,如果该通道已关闭,则退出该功能。另一种选择是为每个工人使用单独的退出渠道。
随时随地看视频慕课网APP

相关分类

Go
我要回答