Go Concurrency Pattern- will this leave hanging goroutines?

Issue

In Rob Pike’s Google IO talk on Go Concurrency Patterns, he presented this code as an example of how to pick the fastest responder from a number of replica servers:

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
}

Question: Won’t this leave N-1 of the replica goroutines blocking on a channel write?

In the discussion after the talk, one of the audience members seems to be asking this question, but got kind of a handy-wavy response.

I’d be inclined to change the 3rd line to something like this:

searchReplica := func(i int) {
   select {
      case c <- replicas[i](query):
      default: // non-blocking write
 }
}

Solution

You are correct. But that doesn’t fit on a single slide. He was talking about concurrency patterns, not necessarily the code to do it.

Of course, I still wouldn’t have put that code on a slide…

Answered By – Stephen Weinberg

Answer Checked By – Cary Denson (GoLangFix Admin)

Leave a Reply

Your email address will not be published.