当调用 cancelFunc() 时,golang 子函数何时(多快)被取消?

When (how quickly) is a golang child function cancelled when cancelFunc() is called?

我想访问 Redis 并在两台机器上同时执行 GET。我将使用我得到的第一个结果并取消另一个调用。

我想知道的是 cancelFunc() 是立即中断一个 go 函数,还是它会等待特定事件发生,然后才会注意到信号。 documentation 只是说:

Calling the CancelFunc cancels the child and its children, removes the parent's reference to the child, and stops any associated timers.

这并没有说明它是立即发生还是需要达到一个特殊的取消点。

我错过了关于那个特定点的任何文档吗?

取消上下文只是关闭其 Done 通道,它不会“杀死”goroutine 或类似的东西。在上下文中执行的代码必须执行 select 以注意到 Done 通道的关闭并放弃它正在做的任何工作。

但是在很多情况下,这项工作已经为您完成了。如果您用来发出请求的 Redis 客户端方法接受一个上下文,那么可以安全地假设如果该上下文被取消,客户端将处理取消并且该方法将立即 return 一个 [=13 的错误=] — 您需要做的就是通过退出您正在做的事情来处理该错误。