调用cancelFunc()时,golang子函数何时(以多快的速度)被取消?
我想访问Redis并同时在两台机器上进行访问。我将使用得到的第一个结果取消另一个呼叫 我想知道的是调用cancelFunc()时,golang子函数何时(以多快的速度)被取消?,go,cancellation,Go,Cancellation,我想访问Redis并同时在两台机器上进行访问。我将使用得到的第一个结果取消另一个呼叫 我想知道的是cancelFunc()是否会立即中断go函数,或者它是否会在注意到信号之前等待特定事件发生。法官说: 调用CancelFunc将取消子项及其子项,删除父项对子项的引用,并停止任何关联的计时器 这并不是说它是否立即发生或者是否需要达到一个特殊的取消点 关于这一点我遗漏了什么文档?取消上下文只会关闭它的Done频道,它不会“杀死”goroutine或类似的东西。在上下文下执行的代码必须执行select
cancelFunc()
是否会立即中断go函数,或者它是否会在注意到信号之前等待特定事件发生。法官说:
调用CancelFunc
将取消子项及其子项,删除父项对子项的引用,并停止任何关联的计时器
这并不是说它是否立即发生或者是否需要达到一个特殊的取消点
关于这一点我遗漏了什么文档?取消上下文只会关闭它的
Done
频道,它不会“杀死”goroutine或类似的东西。在上下文下执行的代码必须执行select
以注意Done
通道的关闭,并放弃它正在执行的任何工作
然而,在许多情况下,这项工作已经为您完成。如果您用于发出请求的redis客户端方法接受上下文,那么可以安全地假设,如果该上下文被取消,客户端将处理取消操作,该方法将立即返回一个
上下文错误。Canceled
-您需要做的就是通过退出正在执行的操作来处理该错误。CancelFunc不会取消任何函数(您不能“取消”函数),它会取消上下文。你用它做什么取决于你。哈!可以在C语言中,这就像将Done
标志设置为true,当这种情况发生时,您的代码可以执行if(Done)返回代码>。换句话说,接受上下文的应用程序需要积极主动,并尽可能经常地检查它是否应该尽快停止。@Alexiswillke或多或少,除了频道关闭是select
able,这不是标志变量可以做的。:)