此问题在此处已有答案:
Go concurrency and channel confusion(1个答案)
上个月关门了。
我正在学习Go语言的并发模型,在Oreilly的《学习Go语言》一书中看到了一个例子。在下面的例子中,“r:=〈-result”会阻塞,直到有goroutine写入结果通道,因为result是无缓冲通道,其他goroutine对result的后续写入也会阻塞,直到result通道再次为空。我的问题是,如果有两个goroutine并行运行,同时写入结果通道(result通道当时为空),在这种情况下,Go运行时如何解决这个问题?
func searchData(s string, searchers []func(string) []string) []string {
done := make(chan struct{})
result := make(chan []string)
for i, searcher := range searchers {
go func(searcher func(string) []string) {
select {
case result <- searcher(s):
case <-done:
}
}(searcher)
}
r := <-result
close(done)
return r
}
1条答案
按热度按时间2vuwiymt1#
当多个goroutine同时向同一个无缓冲通道写入数据时,它们都会阻塞,直到另一个goroutine从通道中读取数据为止;当一个goroutine从通道中读取数据时,其中一个等待的goroutine会继续执行写入操作,而其他goroutine则继续等待,写入者goroutine将被随机选择。
如果多个goroutine同时从一个通道读取数据,同时多个goroutine同时向该通道写入数据,那么一个随机选择的goroutine可以向另一个随机选择的goroutine发送消息。