【发布时间】:2017-04-17 02:13:04
【问题描述】:
我需要调用一个以Context 作为参数的函数。此代码块可以访问一个通道,该通道用于发出应该取消操作的信号。
这是我目前用来在收到值时取消 Context 的方法:
func doSomething(stop <-chan bool) {
ctx, cancel := context.WithCancel(context.Background())
go func() {
select {
case <-ctx.Done():
case <-stop:
cancel()
}
}()
longRunningFunction(ctx)
}
预期的控制流程如下:
如果任务运行完成,它将取消上下文,
<-ctx.Done()将触发,goroutine 将终止。如果在
stop上接收到值,则取消上下文,通知任务它应该退出。再次,当这种情况发生时,goroutine 将终止。
这似乎过于复杂。有没有更简单的方法来完成预期的行为?
【问题讨论】:
-
如果您的实际代码运行良好,这可能更适合codereview.stackexchange.com
-
@oliverpool 我做了,它很快就关闭了,他们建议我在这里问。
-
我认为你在
doSomething中需要defer cancel(),否则当longRunningFunction完成而不被stop频道取消时,你会泄漏gorutine。您可能还应该使用context.TODO()而不是context.Background(),因为从长远来看,您希望用上下文替换停止通道。