阅读目录
Golang 上下文 context.Background() 控制并传递请求范围数据
Golang 上下文 context.Background() 控制并传递请求范围数据
context.Background() 是 Go 语言中的一个函数,它返回一个空的 Context 对象。
Context 类型是 Go 语言中用于控制并传递请求范围数据、取消信号和截止时间的机制。Background() 函数返回的 Context 对象通常用作整个应用程序的顶级 Context,也可以作为其他 Context 对象的父级。
下面是一个使用 context.Background() 的示例:
package main
import (
"context"
"fmt"
"time"
)
func main() {
// 创建一个父级 Context,通常使用 Background() 函数
parentCtx := context.Background()
// 创建一个子级 Context,并设置截止时间为 2 秒后
ctx, cancel := context.WithTimeout(parentCtx, 2*time.Second)
defer cancel() // 在函数退出时取消子级 Context
// 执行一个耗时操作,模拟网络请求
go performTask(ctx)
// 等待一段时间,以观察是否在截止时间前完成任务
time.Sleep(3 * time.Second)
// 检查任务是否完成或超时
select {
case <-ctx.Done():
fmt.Println("任务超时")
default:
fmt.Println("任务完成")
}
}
func performTask(ctx context.Context) {
// 模拟耗时操作
time.Sleep(5 * time.Second)
// 检查是否被取消
if ctx.Err() != nil {
fmt.Println("任务被取消")
return
}
fmt.Println("任务执行完成")
}
PS E:\TEXT\test> go run .\main.go
任务超时
PS E:\TEXT\test>
在上面的示例中,我们使用 context.Background() 创建一个父级 Context 对象 parentCtx。
我们使用 context.WithTimeout() 函数创建一个子级 Context 对象 ctx,并设置截止时间为 2 秒后。
接下来,我们使用 performTask() 函数来执行一个模拟的耗时操作。 在主函数中,我们等待 3 秒钟,然后检查任务是否在截止时间前完成。 如果任务完成,则输出"任务完成",如果任务超时,则输出"任务超时"。
使用 context.Background() 创建的父级 Context 对象通常是在整个应用程序的顶级范围内使用,而不是针对特定的请求或操作。
它可以作为其他 Context 对象的父级,用于传递公共的上下文信息,例如用户身份验证、日志记录等。
time.Sleep(6 * time.Second)
PS E:\TEXT\test> go run .\main.go
任务被取消
任务超时
PS E:\TEXT\test>
ctx, cancel := context.WithTimeout(parentCtx, 6*time.Second)
time.Sleep(6 * time.Second)
PS E:\TEXT\test> go run .\main.go
任务执行完成
main任务完成
好文推荐
发表评论