Go 并发模式 - 这会留下挂起的 goroutines 吗?

在 Rob Pike关于 Go Concurrency Patterns的Google IO 演讲中,他提供了此代码作为如何从多个副本服务器中选择最快响应者的示例:


func First(query string, replicas ...Search) Result {

    c := make(chan Result)

    searchReplica := func(i int) { c <- replicas[i](query) }

    for i := range replicas {

        go searchReplica(i)

    }

    return <-c

}

问题:这不会让 N-1 个副本 goroutine 阻塞在通道写入上吗?


在演讲结束后的讨论中,一位听众似乎在问这个问题,但得到了一种轻松波浪式的回应。


我倾向于将第三行更改为这样的:


searchReplica := func(i int) {

   select {

      case c <- replicas[i](query):

      default: // non-blocking write

 }

}


有只小跳蛙
浏览 156回答 1
1回答

慕森卡

你是对的。但这并不适合单张幻灯片。他谈论的是并发模式,不一定是执行它的代码。当然,我仍然不会将该代码放在幻灯片上......
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go