当前位置: 首页 > 面试题库 >

单个通道上有多个接收器。谁获取数据?

曹泉
2023-03-14
问题内容

无缓冲通道会阻塞接收器,直到通道上有可用数据为止。对我来说,目前还不清楚这种阻塞如何在同一通道上的多个接收器下发生(例如,使用goroutines时)。我确信只要该通道上没有数据发送,它们都会阻塞。
但是,一旦我向该通道发送单个值,会发生什么?哪个接收者/ goroutine将获取数据并因此解除阻止?他们全部?排在第一位?随机?


问题答案:

单个随机(不确定)的将接收它。

请参阅语言规范:

“ select”语句的执行分几个步骤进行:

  1. 对于语句中的所有情况,输入“
    select”语句后,将按源顺序对接收操作的通道操作数以及send语句的通道和右侧表达式进行一次精确评估。结果是一组要从中接收或发送到的通道,以及要发送的相应值。无论选择进行哪个通信操作,都会发生该评估中的任何副作用。带有简短变量声明或赋值的RecvStmt左侧的表达式尚未评估。
  2. 如果可以进行一种或多种通信,则可以通过统一的伪随机选择来选择可以进行的单个通信
    否则,如果存在默认情况,则选择该情况。如果没有默认情况,则“ select”语句将阻塞,直到可以进行至少一种通信为止。
  3. 除非所选情况是默认情况,否则将执行相应的通信操作。
  4. 如果所选案例是带有简短变量声明或赋值的RecvStmt,则将评估左侧表达式并分配接收的值(或多个值)。
  5. 执行所选案例的语句列表。


 类似资料:
  • 如何在不使用XML的情况下将2个通道输出到具有Spring集成的单个通道。类似于以下问题多通道的消息进入单通道 在我的上下文中,我有2个PollableChannel bean,我希望将消息从这两个bean(非聚合)路由到一个@ServiceActivator,即完成如下操作:

  • 对于下面的场景是如何工作的,我有点困惑。这是一个非常简单的设置,所以我希望解释很简单。 我有一个单一的物理网卡主机。我创建了一个单一的macvlan子接口在桥接模式关闭这个物理网卡。然后我启动两个LXD/LXC容器。每个都有自己独特的MAC和IP,但是在配置文件中,我指定了与每个容器的父接口相同的单个macvlan子接口。 两个容器都可以毫无问题地访问网络。我还能够使用每个容器的唯一IP地址SSH

  • 问题内容: 我在Go中有一个返回两个值的函数。我想将其作为goroutine运行,但是我无法弄清楚创建接收两个值的通道的语法。有人能指出我正确的方向吗? 问题答案: 使用两个值的字段定义自定义类型,然后创建该类型的。 编辑:我还添加了一个使用多个通道而不是自定义类型的示例(在底部)。我不确定哪个更惯用。 例如: 然后 使用自定义类型的频道(Playground)的示例: 产生: LOREM,5 I

  • 问题内容: 我有多个goroutine试图同时在同一频道上接收。似乎最后一个在通道上开始接收的goroutine获得了值。这是语言规范中的某个地方,还是未定义的行为? 输出: 操场上的例子 编辑: 我只是意识到它比我想的还要复杂。该消息在所有goroutine中传递。 输出: 操场上的例子 问题答案: 是的,它很复杂,但是有一些经验法则可以使事情变得简单得多。 宁愿使用 传递给go-routine

  • 我有一条这样的小溪和两个水槽,但一次只使用一个: 或 我们使用哪个接收器是可配置的,但是如果我并行使用两个接收器怎么办?我该怎么做? 我想到了水槽。合并,但它也需要合并策略,我不想以任何方式合并这些汇的结果。我真的不关心它们,所以我只想通过HTTP将相同的数据发送到某个endpoint,同时将它们发送到数据库。Sink combine与broadcast非常相似,但从头开始实现广播会降低代码的可读

  • 问题内容: 我需要使用JSON获取当前时间(从可靠来源)。精确的时间在我的应用程序中至关重要,因此即使只有一两秒钟的时间,我也不能依靠设备的时间。 编辑:我不担心“精度”,而只是让运行该应用程序的多个设备具有相同的时间。 问题答案: function getTime(zone, success) { var url = 'http://json-time.appspot.com/time.json