小编典典

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

go

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


阅读 246

收藏
2020-07-02

共1个答案

小编典典

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

请参阅语言规范

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

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