Copyright © 2022-2025 aizws.net · 网站版本: v1.2.6·内部版本: v1.25.2·
页面加载耗时 0.00 毫秒·物理内存 120.1MB ·虚拟内存 1372.4MB
欢迎来到 AI 中文社区(简称 AI 中文社),这里是学习交流 AI 人工智能技术的中文社区。 为了更好的体验,本站推荐使用 Chrome 浏览器。
Go 1.7 标准库引入 context 包,中文翻译为 “上下文”,准确说它是 goroutine 的上下文,它包含 goroutine 的运行状态、环境、现场等信息。
context 主要用来在 goroutine 之间传递上下文信息,包括:取消信号、超时时间、截止时间、共享数据等。
随着 context 包的引入,标准库中很多接口加上了 context.Context 参数,例如 database/sql 包。context 几乎成为了并发控制和超时控制的标准做法。
context.Context 类型的值可以协调多个 groutine 中的代码执行取消操作,共享键值数据,而且它是并发安全的。与其它协作的 API 都可以由外部控制执行取消操作,例如:取消一个 HTTP 请求的执行。
context 包位于 src/context/context.go 源码文件中。
context.Context 接口的源码:
// Context携带一个跨越API边界的截止日期、取消信号和请求范围的值。
// 它的方法是并发安全的,可以同时被多个 goroutin 使用。
type Context interface {
// Done 返回一个通道,该通道在上下文被取消或超时时关闭。
Done() <-chan struct{}
// Err 指示关闭完成通道后,取消上下文的原因。
Err() error
// Deadline 返回该上下文将被取消的截止时间(如果有的话)。
Deadline() (deadline time.Time, ok bool)
// Value返回与 key 关联的值,如果没有则返回 nil。
Value(key interface{}) interface{}
}
使用 Context 的控制协程的简单范例。调用者 main 函数,启动运行一个协程 contextTest, 3秒后主动取消 contextTest 的运行。
package main
import (
"context"
"time"
)
func contextTest(ctx context.Context) {
cancelFlag := false // 取消标志
// 协程,用于监控是否被其它协程通知取消
go func(ctx context.Context) {
select {
case <- ctx.Done():
cancelFlag = true
}
}(ctx)
for {
// 检测取消标记,一旦为真,就结束协程
if cancelFlag {
println("goroutin finished")
return
}
// 每隔 1 秒钟,打印 running
time.Sleep(time.Second)
println("running")
}
}
func main() {
// 返回值 cancelFunc 是一个函数,用于取消运行中的协程
ctx, cancelFunc := context.WithCancel(context.Background())
go contextTest(ctx)
// 让contextTest 协程运行 3 秒钟,然后调用取消函数
time.Sleep(3*time.Second)
println("send a closed signal")
cancelFunc()
// 等待 3 秒钟,让 contextTest 协程优雅结束。
time.Sleep(3*time.Second)
}
Golang Context 的作用和用法:context 主要用来在 goroutine 之间传递上下文信息,包括:取消信号、超时时间、截止时间、共享数据等。在 Go 语言程序中,关闭协程可以通过 channel+select 方式实现, ...