Golang-并发退出

在工作中可能要起多个 Goroutine 跑任务,有时候遇到问题需要中止所以的 Goroutine 暂停或者退出。

控制并发通常有三种方法

  • 全局共享变量

  • channel 通信

  • Context 包

全局共享变量

这种模式最为简单,所有的 Goroutine 轮询变量,来决定要不要继续跑任务。

running := true
f:= func() {
    for running {
        fmt.Println("sub proc running")
        time.Sleep(time.Second)
    }
}
go f()
go f()
go f()
time.Sleep(time.Second)
running = false
fmt.Println("set running=false")
time.Sleep(time.Second)
fmt.Println("main proc exit")

channel 通信

一种更通用灵活的实现方式。下面是一种从外部中止所有goroutine的示例

Context

Context的创建和调用关系是层层递进的,也就是我们通常所说的链式调用,类似数据结构里的树,从根节点开始,每一次调用就衍生一个叶子节点。

context 超时退出

panic

Last updated

Was this helpful?