如果队列可以从处理函数本身增长,我试图了解如何在 Go 中处理队列。请参阅下面的代码。
在此伪代码中,我想将我创建的处理程序数量限制为 10。因此我创建了 10 个处理队列的处理程序。然后我用一个 url 开始排队。
我的问题是,根据文档,sender通道将阻塞,直到接收方接收到数据。在下面的代码中,每个进程都是一个处理新 url 的接收器。然而,很容易看出,如果一个进程向队列发送 11 个链接,它将阻塞,直到所有接收者都处理完这些新链接。如果这些接收者每个都有 1 个链接,那么它们也会在将新的 1 个链接发送到队列时阻塞。由于每个人都被阻止,所以什么都没有完成。
我想知道 go 的一般解决方案是什么,用于处理可以从进程本身增长的队列。请注意,我认为我可以通过锁定名为 的数组来执行此操作queue,但我正在尝试了解如何使用通道来完成此操作。
var queue = make(chan string)
func process(){
for currentURL := range queue {
links, _ := ... // some http call that gets links from a url
for _, link := links {
queue <- link
}
}
}
func main () {
for i :=0; i < 10; i++ {
go process()
}
queue <- "https://stackoverflow.com"
...
// block until receive some quit message
<-quit
}
拉丁的传说
弑天下
相关分类