为了账号安全,请及时绑定邮箱和手机立即绑定

防止上下文取消在业务逻辑中停止函数执行

防止上下文取消在业务逻辑中停止函数执行

Go
守着一只汪 2022-09-19 17:13:49
有没有办法保护业务逻辑的执行免受上下文取消的影响?这是代码片段,以便更好地理解我的问题func main() {    ctx, cancel := context.WithCancel(context.Background())    go foo(ctx)    time.Sleep(time.Second * 3)    cancel()}func foo(ctx context.Context) {    // batch process data    // context cancel should not stop function execution     // in the middle of business logic    for i:= 0; i<10; i++ {        fmt.Println("START of business logic for ID:", i)        fmt.Println("Critical component")        fmt.Print("Saving changes to DB...")        time.Sleep(time.Second * 1)        fmt.Println("Done")        fmt.Println("END of business logic for ID:", i)    }}输出:START of business logic for ID: 0Critical componentSaving changes to DB...DoneEND of business logic for ID: 0START of business logic for ID: 1Critical componentSaving changes to DB...DoneEND of business logic for ID: 1START of business logic for ID: 2Critical componentSaving changes to DB...DoneEND of business logic for ID: 2当执行在 for 循环中开始时,在完成该迭代之前不应停止。使用上下文取消是否可以这样做?或者我应该使用另一种方法,请建议。去游乐场链接
查看完整描述

1 回答

?
缥缈止盈

TA贡献2041条经验 获得超4个赞

上下文取消是任务的信号机制。它不能确保执行 - 这留给任务。这允许任务在中止较大操作之前完成关键子任务。


因此,在您的理论示例中,任何关键子步骤都应忽略取消 - 并且只有在它们完成后才轮询上下文:


select {

    case <-ctx.Done():

        return ctx.Err() // we're cancelled, abort

    default:

}

编辑:应用于您的示例


for i := 0; i < 10; i++ {

    //

    // critical section

    //


    // ...


    select {

    case <-ctx.Done():

        return ctx.Err() // we're cancelled, abort

    default:

    }

}

https://play.golang.org/p/kZ39VEVyP4L


查看完整回答
反对 回复 2022-09-19
  • 1 回答
  • 0 关注
  • 67 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信