3 回答

TA贡献1842条经验 获得超13个赞
一个无缓冲的通道写入将阻塞,直到另一个 goroutine 从中读取。发生这种情况时,读取和写入 goroutine 都会启用。之后,无法保证执行将如何进行。
在您的示例中,firstFunc
从通道读取后,它会运行直到完成。主 goroutine 写入通道 2,启用secondFunc
,但在它有机会完成写入之前,主 goroutine 结束。
这里的问题是有许多可能的执行顺序,而您碰巧观察到一种特定的顺序。

TA贡献2039条经验 获得超8个赞
您看不到输出,secondFunc因为 main 在它有机会执行之前就结束了。解决此问题的一种简单方法是time.Sleep(time.Second)在打印“main() 结束”之前添加。
更正确的方法是使用等待组,如下所示:
wg := sync.WaitGroup{}
wg.Add(2)
go func() { firstFunc(c1); wg.Done() }()
go func() { secondFunc(c2); wg.Done() }()
... // write to channels
wg.Wait() // This blocks till both the go-routines are done

TA贡献1757条经验 获得超7个赞
它不会因为有 2 个通道侦听器(firstFunc 和 secondFunc)而阻塞。这些以随机顺序阅读您的消息(以先醒来者为准)。所以阻塞是存在的,但对于活跃的听众来说是无法观察到的。您唯一会看到的是,有时您会首先看到 firstFunc 的输出,有时您会看到 secondFunc 的输出
- 3 回答
- 0 关注
- 146 浏览
添加回答
举报