concurrency - 使用固定数量的工作人员处理永无休止的队列中的作业

标签 concurrency go

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

  • 我想要有固定数量的 N 个 goroutine 并行运行
  • 我将从永无休止的队列中获取 X 条有关要处理的作业的消息
  • 我想让 N 个 goroutine 处理这 X 个作业,一旦其中一个例程无事可做,我就想从永无休止的队列中获取另外 X 个作业

下面答案中的代码(参见网址)可以出色地处理任务,但是一旦任务列表为空,工作人员就会死亡,我希望他们保持活力并以某种方式通知主代码他们失业了这样我就可以获取更多工作来填充任务列表

How would you define a pool of goroutines to be executed at once in Golang?

使用下面的 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)
    }

}

最佳答案

这就是 select 语句的用途。

func Worker(workChan chan<- Work, requestChan chan<- struct{}) {
    for {
        select {
        case work := <-workChan:
            // Do work
        case requestChan <- struct{}{}:
        }
    }
}

这个 worker 将永远运行。如果工作可用,它将从工作 channel 中提取。如果没有剩余,它将发送请求。

并不是说它会永远运行,如果你想杀死一个 worker ,你需要做其他事情。一种可能性是始终使用workChan 检查ok,如果该 channel 已关闭,则退出该函数。另一种选择是为每个工作人员使用单独的退出 channel 。

关于concurrency - 使用固定数量的工作人员处理永无休止的队列中的作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22597341/

相关文章:

sql - 将 DB2 驱动程序与 Informix 一起使用

go - 这个语法是指向 slice 的指针还是指针的 slice ?

multithreading - 如何使用Data.Concurrent.mergeIO?

java 在应用程序级别同步数据库查询

JavaFX ChangeListener 并不总是有效

Java:您可以在不显式创建 block 的情况下同步变量吗?

inheritance - Go 中创建复杂结构层次结构的惯用方法是什么?

python - 对于将 Python Lock 对象存储在 Beaker session 中,我应该有什么顾虑吗?

go - golang.org/x/text/message.Print 完成了什么?

google-app-engine - 使用 Golang 中的 Google 数据存储区中的任意键数组进行查询