Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Concurrency 使用固定数量的工作人员处理从不间断队列中的作业_Concurrency_Go - Fatal编程技术网

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个作业
下面答案中的代码(参见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)
    }

}
导入(
“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,其中一名工作人员可能会向其写入内容。-是否有更简单的版本不足以满足您的需求?