在 Go 语言中,Context(上下文)用于管理协程之间的取消、超时和传值。当父 Context 被取消或过期时,子 Context 也会受到影响。
当父 Context 被取消时,所有基于该父 Context 创建的子 Context 都会被取消。这意味着如果在子协程中使用了已经被取消的子 Context,该子协程将立即返回并结束执行。
以下是一个示例代码来说明这个概念:
package main
import (
"context"
"fmt"
"time"
)
func worker(ctx context.Context) {
for {
select {
case <-ctx.Done():
fmt.Println("Worker canceled")
return
default:
fmt.Println("Working...")
time.Sleep(1 * time.Second)
}
}
}
func main() {
parentCtx, cancel := context.WithCancel(context.Background())
childCtx, _ := context.WithCancel(parentCtx)
go worker(childCtx)
time.Sleep(3 * time.Second)
cancel()
time.Sleep(2 * time.Second)
fmt.Println("Main goroutine ends")
}
在这个例子中,我们创建了一个父 Context parentCtx 和一个继承自父 Context 的子 Context childCtx。然后我们启动了一个协程,在其中使用了子 Context 执行工作任务。同时,主线程等待一段时间后调用 cancel() 函数来取消父 Context。
当主线程调用 cancel() 取消父 Context 后,由于继承关系,子 Context 也会被取消。因此,子协程中的工作任务会立即停止执行。在示例代码中,我们可以看到打印出 “Worker canceled”,表示子协程已被取消。
最后,主线程等待一段时间后结束,输出 “Main goroutine ends”。
总结来说,父 Context 的取消会影响到所有继承自它的子 Context,并导致相应的协程停止执行。
内容由零声教学AI助手提供,问题来源于学员提问




