Concurrency 使用固定数量的工作人员处理从不间断队列中的作业
这让我头疼,我想不出怎么解决它Concurrency 使用固定数量的工作人员处理从不间断队列中的作业,concurrency,go,Concurrency,Go,这让我头疼,我想不出怎么解决它 我希望有固定数量的N个goroutine并行运行 从一个永无止境的队列中,我将获取关于要处理的作业的X msg 我想让N个goroutine处理这些X个作业,一旦其中一个例程没有更多的事情要做,我就想从无休止队列中获取另一个X个作业 下面答案中的代码(参见url)非常适合处理任务,但是一旦任务列表为空,工作人员就会死亡,我希望他们能够活着,并以某种方式通知主代码他们已经失业,这样我就可以获取更多的工作来用任务填充任务列表 使用下面的user:Jsor示例代码
- 我希望有固定数量的N个goroutine并行运行
- 从一个永无止境的队列中,我将获取关于要处理的作业的X msg
- 我想让N个goroutine处理这些X个作业,一旦其中一个例程没有更多的事情要做,我就想从无休止队列中获取另一个X个作业
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)
}
}
导入(
“fmt”
“strconv”
)
//workChan-提供工作的只读
//请求更改-???这是什么
func-Worker(myid字符串,workChan这就是select
语句的作用
func Worker(workChan chan<- Work, requestChan chan<- struct{}) {
for {
select {
case work := <-workChan:
// Do work
case requestChan <- struct{}{}:
}
}
}
func-Worker(workChan-chan与相比,您只需(首先)不关闭频道,只需继续向频道馈送项目即可
然后,您需要回答以下问题:(a)您是否绝对有必要在其中一个工作人员“无事可做”时(或者,同样,在第一个X项被完全处理或分配给工作人员后)才从队列中提取下一个X项;或者(b)如果您将第二组X项保留在内存中,并在需要新工作项时将它们提供给工人,可以吗
据我所知,只有(a)需要您想知道的请求(见下文)。对于(b),以下简单内容就足够了:
#B版本
类型WorkItem int
常数(
N=5//工人人数
X=15//一次从无限队列中获取的工作项数
)
func-Worker(id int,workChan)还注意到,如果相应的通道关闭,则select
中的case
语句将变为非阻塞语句。谢谢!我仍然不知道它是如何工作的;requestChan是什么,它是如何使用的?(参见上面的示例程序)再想一想,第二个版本也可能会被划掉:它几乎没有添加任何内容,因为select不能保证按自上而下的顺序成功:“如果可以进行多个案例,则会做出统一的伪随机选择来决定将执行哪一个通信。”()因此,一旦调度员正在等待reqChan,其中一名工作人员可能会向其写入内容。-是否有更简单的版本不足以满足您的需求?