关闭通道退出多个去例程?

closing channel quits multiple go routines?

鉴于此代码:

package main

import (
  "fmt"
  "time"
)

func first(quit chan error) {
  fmt.Println("1")
  for {
    select {
    case <-quit:
      fmt.Println("first quits")
      return
    default:
      time.Sleep(20 * time.Millisecond)
    }
  }
}

func second(quit chan error) {
  fmt.Println("2")
  for {
    select {
    case <-quit:
      fmt.Println("second quits")
      return
    default:
      time.Sleep(20 * time.Millisecond)
    }
  }
}

func main() {
  quit := make(chan error)
  go first(quit)
  go second(quit)
  //something happens here, let's just simulate with a sleep
  time.Sleep(500 * time.Millisecond)
  close(quit)
  time.Sleep(500 * time.Millisecond)
}

似乎正确关闭一个通道会终止两个独立的go例程。我认为通道是 1:1 通信路径,我首先尝试将 error 写入 quit 通道,但只有一个 go 例程会读取它。所以我一直在阅读各种扇出策略,直到我想到关闭通道可能才有效。

这样关闭通道是终止独立go例程的正确方法吗?

从关闭的频道读取总是成功。因此,关闭通道通常用于广播所有从该通道读取的 goroutines 发生的事情(超时、取消请求等)。

回答你的问题:测试,关闭通道是让所有goroutines知道是时候终止的正确方法。这就是 context.Context 取消时的作用。