为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
萧十郎 2021-11-01 17:28:11
我有以下情况:我在频道上收到一条消息,告诉我上传文件。上传是由阻塞功能完成的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

            }

         }

      }()


   }


}

当然,您可以添加停止条件,可能使用不同的通道,但基本思想是相同的。


查看完整回答
反对 回复 2021-11-01
  • 2 回答
  • 0 关注
  • 155 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信