阅读目录

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任务完成

好文推荐

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: