请教 goroutine 通信写法问题
<p><img alt="image" class="embedded_image" loading="lazy" referrerpolicy="no-referrer" rel="noreferrer" src="https://user-images.githubusercontent.com/11831441/185095328-6e6e5542-0215-4c70-87eb-31a100b8a35e.png"></p>
<p>第一种想法如上图: main goroutine 遍历这个 chan, 将所有数据读出. 但是问题是. 左边那三个 goroutine 如果结束了. main goroutine 如何结束? 岂不是阻塞了? 也没法关闭, 如果左边的其中一个关闭了. 那另外两个的数据就读不出来了.</p>
<p>第二种思路是创建三个 chan <img alt="image" class="embedded_image" loading="lazy" referrerpolicy="no-referrer" rel="noreferrer" src="https://user-images.githubusercontent.com/11831441/185095723-e5222b37-f2c3-4ca3-8226-6558c203b4b1.png"></p>
<p>这个直接 close 就行了.</p>
<p>我的问题是: 第一种想法中的问题如何解决?</p>
<p>是不是实践中第二种想法比较符合套路?</p>
<p>确实是新手. 大佬勿喷.</p>
收藏(0)
分享
相关标签:
注意:本文归作者所有,未经作者允许,不得转载
-
2022年8月17日 11:18
你们真强,我都没看明白楼主在说啥。
0
0
-
2022年8月17日 12:49
也不是一定要结束, 而是继续往下走.
0
0
-
2022年8月17日 12:49
第二种吧,逻辑清晰,实现简单
0
0
-
2022年8月17日 13:16
可以看一下
0
0
-
2022年8月18日 03:48
close chan 两个原则
1. 不要在接收端关闭, 也就是你代码里的 main goroutine
2. 有多个同时写, 不要在写的地方关闭, 也就是你的代码中 goroutine1,2,3
所以最好的做法, 就是楼上给的那个代码, 先 waitGroup 够三个之后, 直接在 main 关闭就行了
0
0
-
2022年8月18日 03:48
@
谢谢 最后用的这个方法解决了.
0
0
-
2022年8月18日 03:48
package main
import (
"fmt"
"math/rand"
"sync"
"time"
)
func main() {
// init var
ch := make(chan int)
wg := &sync.WaitGroup{}
// goroutine1, 2, 3
for i := 0; i < 3; i++ {
wg.Add(1)
go task(wg, ch)
}
// read chan data
go func() {
for val := range ch {
fmt.Println(val)
}
}()
// wait group
wg.Wait()
close(ch)
// close fast, can`t read all chan data
time.Sleep(time.Second)
}
func task(wg *sync.WaitGroup, ch chan int) {
defer wg.Done()
ts := rand.Intn(3) + 1
time.Sleep(time.Second * time.Duration(ts))
ch <- ts
}
0
0
-
2022年8月18日 03:48
channel 为什么要关闭?
0
0