
为什么 golang 中执行了 context 的 cancel,但 <- ctx.done() 却没有执行?
在给定的代码示例中,gen 函数生成一个通道,在收到 ctx.done() 信号时打印 "done",否则生成并发送一个数字。main 函数使用 withcancel 创建了一个有取消功能的 context,并通过调用 cancel 取消它。
预期的是,当执行 cancel() 时,<- ctx.done() 应该立即执行,打印 "done"。但是,在给定的代码中,这并没有发生。这是因为代码在取消 context 之前已经阻塞在 ch<-n 上了。
Shell本身是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。它虽然不是Linux系统核心的一部分,但它调用了系统核心的大部分功能来执行程序、建立文件并以并行的方式协调各个程序的运行。因此,对于用户来说,shell是最重要的实用程序,深入了解和熟练掌握shell的特性极其使用方法,是用好Linux系统
24
解决这个问题的方法是在 gen 函数中在关闭 context 时关闭通道。这将导致 range 循环结束,并允许 <- ctx.done() 执行。修改后的 gen 函数如下:
立即学习“go语言免费学习笔记(深入)”;
func gen(ctx context.Context) <-chan interface{} {
ch := make(chan interface{})
go func() {
n := 0
for {
select {
case <-ctx.Done():
fmt.Println("done")
close(ch) // 关闭通道,range 结束
return
default:
n += 1
ch <- n
}
}
}()
return ch
}以上就是Golang 中执行了 context 的 Cancel,但的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号