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条)

报告相同问题?

悬赏问题

  • ¥15 如何用Labview在myRIO上做LCD显示?(语言-开发语言)
  • ¥15 Vue3地图和异步函数使用
  • ¥15 C++ yoloV5改写遇到的问题
  • ¥20 win11修改中文用户名路径
  • ¥15 win2012磁盘空间不足,c盘正常,d盘无法写入
  • ¥15 用土力学知识进行土坡稳定性分析与挡土墙设计
  • ¥70 PlayWright在Java上连接CDP关联本地Chrome启动失败,貌似是Windows端口转发问题
  • ¥15 帮我写一个c++工程
  • ¥30 Eclipse官网打不开,官网首页进不去,显示无法访问此页面,求解决方法
  • ¥15 关于smbclient 库的使用