登录
首页 >  Golang >  Go问答

优先考虑一种通信渠道

来源:stackoverflow

时间:2024-02-19 17:24:24 336浏览 收藏

亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《优先考虑一种通信渠道》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下,希望所有认真读完的童鞋们,都有实质性的提高。

问题内容

我知道,如果在 select 语句中可以进行多个“通信”,则将随机选择一个。我正在尝试寻找一种替代方法,可以更喜欢一种“沟通”而不是另一种。

背景是我正在使用上下文杀死的通道上的 go 例程中发送值。当我杀死它时,我希望立即关闭通道,但目前代码有时会在关闭通道之前在通道上发送最终值。

这是代码的简化版本:

ctx, cancel := context.WithCancel(context.Background())
   ch := make(chan int)

   go func() {
      defer close(ch)
      for i := 1; ; i++ {
         select {
         case <-ctx.Done():
            return
         case ch <- i:
         }
      }
   }()

   print(<-ch)
   print(<-ch)
   cancel()
   print(<-ch)
   print(<-ch)

有时会打印 1200,但通常会打印 1230。在演示中尝试一下

关于如何重新组织代码以支持第一种情况,有什么想法吗? (即始终打印 1200。)


解决方案


这似乎不可能,因为 cancel() 不是主 goroutine 中的阻塞操作。因此,当 select 解锁时,可能存在多种可用情况,并且无法使一个通道优于另一个通道。任何类型的检查通道然后写入方案都将是活泼的,因为检查后可以取消上下文。

使用 done 通道并对其进行写入而不是取消上下文是可行的,因为写入 done 通道将是主 goroutine 的一项阻塞操作,并且 select 将始终有一个活动情况。

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《优先考虑一种通信渠道》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>