我有以下情况:我在频道上收到一条消息,告诉我上传文件。上传是由阻塞功能完成的uploadToServer。该zipGen频道每秒可能会收到几条消息,我想同时上传最多 5 个文件(不会更多,但可能更少 - 取决于zipGen超出此问题范围的第三个工作人员发送的消息数量)。该listenToZips函数在 go 例程中运行(go listenToZips()在文件的init函数上):func listenToZips() { for { select { case zip := <-zipGen: uploadToServer(zip) // this is blocking } }}如果我启动go uploadToServer(zip)而不是仅仅启动uploadToServer(zip)- 我会得到太多并发(例如,我的程序将尝试同时上传 10 个文件,但我最多需要 5 个)。另一方面,没有go uploadToServer(zip)(uploadToServer(zip)就像在上面的函数中一样使用),我一次只上传一个文件(因为它uploadToServer(zip)被阻塞了)。我怎样才能达到这种控制水平,让我最多同时上传 5 个文件?
2 回答
翻过高山走不出你
TA贡献1875条经验 获得超3个赞
最简单的选择 - 预生成 N 个 goroutines,它们从通道中获取输入,并在循环中上传它。在每个 goroutine 的上下文中,操作将被阻塞,但是 N 个 goroutine 会这样做。当然,只有一个 goroutine 会收到每条消息。
func listenToZips(concurrent int) {
for i:=0; i < concurrent; i++ {
// spawn a listener goroutine
go func() {
for {
select {
case zip := <-zipGen:
uploadToServer(zip) // this is blocking
}
}
}()
}
}
当然,您可以添加停止条件,可能使用不同的通道,但基本思想是相同的。
- 2 回答
- 0 关注
- 155 浏览
添加回答
举报
0/150
提交
取消