文章目录
contex
context.WithCancel
使用示例:
package main
import (
"context"
"log"
"time"
)
func main() {
ctx, cancel := context.WithCancel(context.Background())
// 启动goroutine处理
go func(ctx context.Context) {
i := 0
for {
// 检测ctx是否被取消
select {
// 调用cancel后直接返回
case <-ctx.Done():
log.Println("context done")
return
// 没有被取消继续工作睡眠1秒后继续工作
case <-time.After(time.Second):
log.Println(i)
i++
}
}
}(ctx)
// 主流程
// ...
time.Sleep(time.Second * 10)
cancel()
time.Sleep(time.Second)
}
context.WithValue
使用示例:
package main
import (
"context"
"log"
"time"
)
func main() {
ctx := context.WithValue(context.Background(), "id", "id_001")
// 启动goroutine处理
f := func(ctx context.Context, key string) {
value := ctx.Value(key)
if value != nil {
log.Println("Get value success, key:", key, "id:", value)
} else {
log.Println("Get value failed, key:", key)
}
}
f(ctx, "id")
f(ctx, "name")
// 主流程
// ...
time.Sleep(time.Second)
}
context.WithDeadline
使用示例
package main
import (
"context"
"log"
"time"
)
func main() {
ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(time.Second*5))
go func(ctx context.Context) {
// 定时检测ctx是否Done
i := 0
for {
select {
case <-ctx.Done():
log.Println("context done")
return
// 每隔一秒检测一次,并执行子任务
case <-time.After(time.Second):
log.Println(i)
i++
// goroutine 处理子任务
// ...
}
}
}(ctx)
// 主流程
// ...
time.Sleep(time.Second * 10)
cancel()
time.Sleep(time.Second)
}