猿问

Golang:限制阻塞操作的并发级别

我有以下情况:我在频道上收到一条消息,告诉我上传文件。上传是由阻塞功能完成的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 个文件?


萧十郎
浏览 164回答 2
2回答

翻过高山走不出你

最简单的选择 - 预生成 N 个 goroutines,它们从通道中获取输入,并在循环中上传它。在每个 goroutine 的上下文中,操作将被阻塞,但是 N 个 goroutine 会这样做。当然,只有一个 goroutine 会收到每条消息。func listenToZips(concurrent int) {&nbsp; &nbsp; for i:=0; i < concurrent; i++ {&nbsp; &nbsp; &nbsp; // spawn a listener goroutine&nbsp; &nbsp; &nbsp; go func() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; select {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; case zip := <-zipGen:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;uploadToServer(zip) // this is blocking&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}&nbsp; &nbsp; &nbsp; }()&nbsp; &nbsp;}}当然,您可以添加停止条件,可能使用不同的通道,但基本思想是相同的。
随时随地看视频慕课网APP

相关分类

Go
我要回答