1 回答
TA贡献1898条经验 获得超8个赞
那看起来不错。一些注意事项:
您可以通过限制您生成的工作程序例程数量以外的方式来限制工作并行度。例如,您可以为收到的每条消息创建一个 goroutine,然后让生成的 goroutine 等待限制并行度的信号量。当然有权衡取舍,但您不仅限于您所描述的方式。
sem := make(chan struct{}, n)
work := func(m sqs.Message) {
sem <- struct{}{} // When there's room we can proceed
// do the work
<-sem // Free room in the channel
}()
for _, m := range queue.ReceiveMessage(MAX_SQS_MESSAGES) {
for _, m0 := range m {
go work(m0)
}
}
仅处理 10 条消息的限制是由堆栈中的其他地方造成的。可能您正在看到前 10 个填充通道的竞赛,然后工作没有完成,或者您可能不小心从工作程序例程中返回。如果您的员工按照您所描述的模式坚持不懈,您将希望确定他们不会回来。
不清楚您是否希望在处理了一定数量的消息后返回该进程。如果您确实希望此进程退出,则需要等待所有工作人员完成其当前任务,并可能在之后通知他们返回。看看sync.WaitGroup同步他们的完成,并有另一个通道来表示没有更多的工作,或者 close msgChannel,并在你的工作人员中处理。(看看二元组返回通道接收表达式。)
- 1 回答
- 0 关注
- 160 浏览
添加回答
举报