doushi1473 2017-07-12 15:13
浏览 33
已采纳

如何在2个频道上等待并在它们都准备就绪时继续读取

Suppose I have 2 buffered channels, How can I wait for both of them, and only continue when both of the channel have at least one item in it?

It looks like assemble a machine with two parts, only when both part are at hand can I continue my work.

Both queue are empty, wait.
-------------------
|     |     |     |   QUEUE A
-------------------

-------------------
|     |     |     |   QUEUE B
-------------------


Queue A has one element but Queue B empty, wait
-------------------
|     |     |  X  |   QUEUE A
-------------------

-------------------
|     |     |     |   QUEUE B
-------------------


Queue A has two elements but Queue B empty, still wait
-------------------
|     |  Y  |  X  |   QUEUE A
-------------------

-------------------
|     |     |     |   QUEUE B
-------------------


Both queue has item in it, consume one from each queue.
-------------------
|     |  Y  |  X  |   QUEUE A
-------------------

-------------------
|     |     |  Z  |   QUEUE B
-------------------


Now, Queue B empty again, wait ...
-------------------
|     |     |  Y  |   QUEUE A
-------------------

-------------------
|     |     |     |   QUEUE B
-------------------
  • 写回答

2条回答 默认 最新

  • duanqian6295 2017-07-12 15:19
    关注

    Receiving from 2 channels is not atomic. You can check the number of elements queued in a channel's buffer using the builtin len() function, but you can't do a 2-channel atomic receive.

    Meaning by the time you receive a value from one channel, the other channel might not be ready to receive from (e.g. another goroutine might already have received from it).

    If there is only one goroutine that consumes and processes these values, simply receive a value from both channels, it will block if a value is not ready (if channel is not ready to receive from):

    v1 := <- ch1
    v2 := <- ch2
    
    // process v1 and v2
    

    Also note that receiving also succeeds if the channel is closed.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?