在Go语言中,goroutine的上下文(context)通常用于传递和控制取消信号、超时等。当父协程的上下文被关闭(即调用了cancel函数),子协程会受到影响。
当父协程的上下文被取消时,子协程也会收到取消信号。这意味着子协程可以检测到父协程已经关闭,并且可以根据需要做出相应的处理,如释放资源、提前退出等。
下面是一个简单的示例代码:
package main
import (
"context"
"fmt"
"time"
)
func worker(ctx context.Context) {
for {
select {
case <-ctx.Done():
fmt.Println("父 ctx 被关闭,子协程退出")
return
default:
fmt.Println("子协程执行中...")
time.Sleep(1 * time.Second)
}
}
}
func main() {
parentCtx, cancel := context.WithCancel(context.Background())
go worker(parentCtx)
time.Sleep(3 * time.Second)
cancel() // 关闭父 ctx
time.Sleep(2 * time.Second) // 等待一段时间观察输出结果
}
在上述示例中,我们创建了一个父上下文parentCtx和对应的取消函数cancel。然后,在主函数中启动一个子协程来执行工作任务worker。主函数等待一段时间后调用cancel函数来关闭父上下文。
运行以上代码,你会看到子协程中会输出”子协程执行中…“,当父上下文被关闭后,子协程会收到取消信号并退出。
请注意,在实际应用中,应该根据具体情况使用合适的超时设置、错误处理等机制来保证程序的正确性和稳定性。
内容由零声教学AI助手提供,问题来源于学员提问




