Go 取消子上下文

Go 取消子上下文,go,concurrency,Go,Concurrency,我对Golang比较陌生,正在尝试将上下文合并到我的代码中 我看到了从父母那里取消以及共享特定于上下文的内容(例如,日志记录者)的好处 除此之外,我可能遗漏了一些东西,但我看不到一个孩子取消上下文的方法。这里的例子是,如果其中一个子例程遇到错误,这意味着整个上下文都完成了 下面是一些示例代码: 主程序包 进口( “上下文” “fmt” “数学/兰德” “操作系统” “操作系统/信号” “同步” “时间” ) func main(){ ctx,cancel:=context.WithCancel(

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

我看到了从父母那里取消以及共享特定于上下文的内容(例如,日志记录者)的好处

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

下面是一些示例代码:

主程序包
进口(
“上下文”
“fmt”
“数学/兰德”
“操作系统”
“操作系统/信号”
“同步”
“时间”
)
func main(){
ctx,cancel:=context.WithCancel(context.Background())
//句柄信号(控制+c)
go func(){
c:=制造(转换操作信号,1)
信号通知(c,操作系统中断)

子级不能也不应该取消上下文,这是父级的调用。子级可以做的是返回错误,父级应该决定错误是否需要取消上下文

只是因为一个“子任务”失败,并不意味着需要取消所有其他子任务。通常,失败的子任务可能意味着其他子任务变得更重要。想想并行搜索:您可以使用多个子任务从多个源搜索同一事物。您可以使用最快的结果,也可以取消较慢的结果。如果搜索失败s、 你确实希望其余的继续


显然,如果您将取消功能传递给子级,子级将有权取消上下文。但是,将取消上下文的权力留给父级。

子级不能也不应该取消上下文,这是父级的调用。子级可以做的是返回错误,父级应决定错误是否需要取消上下文。

只是因为一个“子任务”失败,并不意味着需要取消所有其他子任务。通常,失败的子任务可能意味着其他子任务变得更重要。想想并行搜索:您可以使用多个子任务从多个源搜索同一事物。您可以使用最快的结果,也可以取消较慢的结果。如果搜索失败s、 你确实希望其余的继续

显然,如果您将cancel函数传递给子级,子级将拥有取消上下文的权限,但将该权限留给父级

这超出了上下文的范围吗?很明显,我可以从child2返回给家长,然后取消,但我想知道是否有更简单的方法

是的,这与上下文完全相反。它们明确地让调用方取消。这里的正确机制是最简单也是最明显的:当
child2DoWork
遇到错误时,它应该返回错误,当调用方返回错误时,如果正确的响应是取消其他任务,那么它可以取消appr适当的上下文

从本质上讲,子任务是一项任务,它应该与任何其他任务隔离。它不应该试图管理它的兄弟姐妹;父任务应该管理它的所有子任务

这超出了上下文的范围吗?很明显,我可以从child2返回给家长,然后取消,但我想知道是否有更简单的方法

是的,这与上下文完全相反。它们明确地让调用方取消。这里的正确机制是最简单也是最明显的:当
child2DoWork
遇到错误时,它应该返回错误,当调用方返回错误时,如果正确的响应是取消其他任务,那么它可以取消appr适当的上下文


从本质上讲,孩子是一项任务,它应该与任何其他任务隔离。它不应该试图管理它的兄弟姐妹;父母应该管理它的所有孩子。

谢谢!这是我的怀疑,但想确认。谢谢!这是我的怀疑,但想确认。