go - 如何在函数调用链中使用 context.Context 取消

标签 go

假设我有这些功能:

func A(ctx context.Context) {
    // A takes some time to process
}

func B(ctx context.Context) {
    // B takes some time to process
}

func C(ctx context.Context) {
    // C takes some time to process
}

注意:每个函数调用都需要一些时间来处理。

注意:B 应该在函数 A 中调用 & C 应该在函数 B 中调用。

只需要针对这种特定情况的示例。

最佳答案

您只需传递与参数相同的上下文,但无论何时您等待来自 channel \远程服务器\任何您使用 select 语句等待 <- ctx.Done() 的结果。每当上下文被取消时(通过取消函数或由于超时),内部 channel 将被关闭并且接收操作总是在关闭的 channel 上解除阻塞。

关于取消的一般帖子(没有上下文,但在心理上将 doneCh 替换为 ctx.Done()) https://blog.golang.org/pipelines

谈论取消(第 15 页的上下文示例) https://talks.golang.org/2014/gotham-context.slide#15

几个例子 https://www.sohamkamani.com/blog/golang/2018-06-17-golang-using-context-cancellation/

关于go - 如何在函数调用链中使用 context.Context 取消,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52996705/

相关文章:

go - go中所有类型的前置函数

dictionary - 如何在 Go 中更新 map 值

nginx - 使用代理服务器在 Golang 应用程序之间切换

go - 计算带小数部分的值

mongodb - 从 mgo golang 执行 mongodb 函数

GOPATH 和 GOBIN 在 Fedora 中设置并导出但仍然没有安装程序

go - 当填充 channel 的函数调用未嵌入 Goroutine 中时,为什么会出现死锁?

go - 如何配置 cloud.google.com/go/logging 使其看起来像写入标准输出的日志?

go - 初始化嵌套匿名结构

linux - 将结构体实例重新声明为相同的变量名将返回 golang 中的旧对象