【问题标题】:Go Concurrency Pattern- will this leave hanging goroutines?Go 并发模式——这会留下挂起的 goroutine 吗?
【发布时间】:2015-03-21 21:09:05
【问题描述】:

在 Rob Pike 的 Google IO talk 关于 Go 并发模式中,他展示了 this code 作为如何从多个副本服务器中选择最快响应者的示例:

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 在通道写入时阻塞吗?

在演讲后的讨论中,一位听众似乎在问这个问题,但得到了一种方便的波浪式回答。

我倾向于将第 3 行改为这样:

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

【问题讨论】:

  • make(chan Result, len(replicas))。如果您不只是想让其他 goroutine 运行完成然后被清理,而是想要一种方法让它们死掉,请查看 context package
  • 也缺少错误处理,因为查询可能会失败。

标签: go goroutine


【解决方案1】:

你是对的。但这不适合单张幻灯片。他说的是并发模式,不一定是代码。

当然,我仍然不会把代码放在幻灯片上...

【讨论】:

  • 我同意不把它放在幻灯片上。实际上,我之所以问这个问题是因为我的代码中存在一个错误,这是基于对通道应该如何工作的误解。看到幻灯片让我觉得它应该是正确的!
猜你喜欢
  • 1970-01-01
  • 2014-03-11
  • 2013-08-06
  • 1970-01-01
  • 1970-01-01
  • 2019-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多