面试题答案
一键面试在Go语言中,context
主要通过以下方式管理协程生命周期:
- 传递信号:
context
可以在不同的协程间传递取消、超时等信号。当父协程取消context
时,所有基于该context
派生的子协程都会收到取消信号,从而安全地退出。 - 携带请求范围的数据:
context
可以携带与请求相关的数据,例如认证信息等,这些数据可以在不同协程间传递。
以下是一个简单示例,展示如何使用context
取消正在运行的协程:
package main
import (
"context"
"fmt"
"time"
)
func worker(ctx context.Context) {
for {
select {
case <-ctx.Done():
fmt.Println("协程收到取消信号,退出")
return
default:
fmt.Println("协程正在工作...")
time.Sleep(1 * time.Second)
}
}
}
使用示例:
func main() {
ctx, cancel := context.WithCancel(context.Background())
go worker(ctx)
time.Sleep(3 * time.Second)
fmt.Println("主协程发起取消操作")
cancel()
time.Sleep(1 * time.Second)
fmt.Println("主协程退出")
}
上述代码中:
context.WithCancel
创建了一个可取消的context
,并返回一个取消函数cancel
。worker
函数通过select
监听ctx.Done()
通道,当该通道接收到信号时,表示context
被取消,协程安全退出。- 在
main
函数中,启动worker
协程,3秒后调用cancel
函数取消context
,从而使worker
协程收到取消信号并退出。