一、Context 简单介绍
context.Context,是专门用来简化对于处理单个请求的多个 goroutine 之间与传递请求数据、同步信号、截止时间等相关操作,这些操作可能涉及多个 API 调用。
1-1 应用场景举例
e.g.1
有一个网络请求 Request,每个 Request 都需要开启一个 goroutine 做一些事情,这些goroutine又可能会开启其他的 goroutine 。我们就可以通过 Context,来跟踪这些 goroutine,并且通过 Context 来控制所有开启的 goroutine 行为。
e.g.2
在 Go 服务器程序中,每个请求都会有一个 goroutine去 处理。
然而,处理程序往往还需要创建额外的 goroutine 去访问后端资源,比如数据库、RPC 服务等。由于这些 goroutine 都是在处理同一个请求,所以它们往往需要访问一些共享的资源,比如用户身份信息、认证 token、请求截止时间等。而且如果请求超时或者被取消后,所有的 goroutine 都应该马上退出并且释放相关的资源。
这种情况也需要用 Context 来为我们取消掉所有 goroutine。
二、控制并发的其他方式
2-1 WaitGroup 等待所有 goroutine 完成
package main
import (
"fmt"
"sync"
"time"
)
func main() {
var wg sync.WaitGroup
wg.Add(2)
go func() {
time.Sleep(2*time.Second)
fmt.Println("Finish 1")
wg.Done()
}()
go func() {
time.Sleep(2*time.Second)
fmt.Println("Finish 2")
wg.Done()
}()
wg.Wait()
fmt.Println("ok")
}
/*
Finish 2
Finish 1
ok
*/
2-2 goroutine 主动推入和读取 Channel 中状态
手动在 channel 内推入数据和死循环读取,若数据状态改变,则完成 goroutine 等操作。
func main() {
stop :=