我有一个异步进程,它应该永远持续下去,看起来像这样:
func asyncForeverTask() {
for {
anyTask()
}
}
func main() {
go asyncForeverTask()
server.run(8080)
}
字符串
我希望能够在某个请求到达服务器时停止此for循环。
我知道我需要使用context.WithCancel()
,但我不知道如何集成它才能工作。我知道以下语法:
for {
select {
case <-ctx.Done:
return
case <-otherCh:
// do smh.
}
}
型
但是asyncForeverTask
不受来自任何其他Ch的信号的影响,而是永远运行。我是一个noobie去,并会感谢任何类型的帮助。
3条答案
按热度按时间tp5buhyn1#
你可以用一个频道来做:
字符串
要取消,只需关闭通道。你必须确保通道只关闭一次,否则你会恐慌。
您也可以使用上下文来执行此操作:
型
或者:
型
要停止,请调用返回的
cancel
函数:型
如果还需要停止
anyTask
,则必须经常检查通道闭包或上下文闭包,并从任务返回。3z6pesqy2#
通道和上下文可以工作,并且可以很方便。但他们不是你唯一的选择。对于这样的东西,简单的
atomic.Bool
可能更简单。类似于:字符串
44u64gxh3#
信不信由你,但这个简单的关闭方法也有效:
字符串
是的,我知道全局变量是邪恶的。只是为了记录。