登录
首页 >  Golang >  Go问答

从孩子取消上下文

来源:Golang技术栈

时间:2023-03-28 12:54:34 271浏览 收藏

本篇文章向大家介绍《从孩子取消上下文》,主要包括golang,具有一定的参考价值,需要的朋友可以参考一下。

问题内容

我对 Golang 比较陌生,正在尝试将 Contexts 合并到我的代码中。

我看到了从父级取消以及共享特定于上下文的内容(例如记录器)方面的好处。

除此之外,我可能会遗漏一些东西,但我看不到孩子取消上下文的方法。此处的示例是,如果其中一个子例程遇到错误,则意味着整个上下文已完成。

这是一些示例代码:

package main

import (
    "context"
    "fmt"
    "math/rand"
    "os"
    "os/signal"
    "sync"
    "time"
)

func main() {
    ctx, cancel := context.WithCancel(context.Background())

    // handle SIGINT (control+c)
    go func() {
        c := make(chan os.Signal, 1)
        signal.Notify(c, os.Interrupt)
        

在这里,您有一个从父级取消的示例(由于 SIGINT),效果很好。但是,在 child2DoWork 中有一个占位符,其中遇到错误,然后我想取消整个上下文,但我看不到使用 vanilla 上下文功能的方法。

这超出了上下文的范围吗?显然,我可以从 child2 与父母沟通,然后可以取消,但我想知道是否没有更简单的方法。

如果与父母沟通是正确的方式,是否有一种惯用的方式来做到这一点?这似乎是一个普遍的问题。

谢谢!

正确答案

孩子不能也不应该取消上下文,这是父母的电话。孩子可以做的是返回一个错误,父母应该决定这个错误是否需要取消上下文。

仅仅因为“子任务”失败,并不意味着所有其他子任务都需要取消。通常,失败的子任务可能意味着其他子任务变得更加重要。想想并行搜索:您可以使用多个子任务在多个来源中搜索相同的东西。您可以使用最快的结果并可能希望取消较慢的结果。如果搜索失败,您 确实 希望其余的继续。

显然,如果你将取消函数传递给孩子,孩子将有权取消上下文。而是将这种权力留给父母。

终于介绍完啦!小伙伴们,这篇关于《从孩子取消上下文》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>