多个Goroutine同时写入一个通道问题[duplicate]

ycl3bljg  于 2022-12-07  发布在  Go
关注(0)|答案(1)|浏览(192)

此问题在此处已有答案

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
}
2vuwiymt

2vuwiymt1#

当多个goroutine同时向同一个无缓冲通道写入数据时,它们都会阻塞,直到另一个goroutine从通道中读取数据为止;当一个goroutine从通道中读取数据时,其中一个等待的goroutine会继续执行写入操作,而其他goroutine则继续等待,写入者goroutine将被随机选择。
如果多个goroutine同时从一个通道读取数据,同时多个goroutine同时向该通道写入数据,那么一个随机选择的goroutine可以向另一个随机选择的goroutine发送消息。

相关问题