我正在处理一段有一个有意的无限循环的代码,我不能修改该代码。我想编写一些关于该方法的测试(例如,确保它在正确的时间触发操作),但我不想孤立一堆go例程。所以我想找到一种方法来杀死/打断那条戈鲁蒂。
我正在考虑将它封装在一个包装函数中,这个函数会在信号发出后杀死它。像这样(不起作用)。
func wrap(inf func()) func() {
return func() {
select {
case inf():
case <-time.After(5 * time.Second):
}
}
}
func main() {
go wrap(inf())()
// do things
}我能想到的所有变体都不起作用。我正在考虑将inf封装在一个写到通道(永远不会被调用)的函数中,或者使用一个返回语句。然后select就可以从中读出。问题是你必须启动它。如果您在这个例程中这样做,您将永远无法到达select。如果你在另一个例行公事中这样做,你只会使问题变得更糟。
那么,有什么办法可以让我放弃这个常规吗?
(是的--我宁愿修改无限循环代码,但这里不能)
发布于 2016-06-23 17:18:10
如果不能更改循环代码,就不能关闭循环。Go是故意设计的,除了真正终止程序本身之外,没有办法从goroutine之外杀死一个goroutine。
如果可以更改循环本身,则杀死例程的典型方法是向goroutine提供退出通道,然后关闭(或发送)该通道,通知循环退出。示例:
quitCh := make(chan struct{})
go func() {
for {
select {
case <-quitCh:
return
// other cases to handle what you need to do
}
}
}()
// Once you're done
close(quitCh) // goroutine exits但是,如果没有将闭包行为编码到循环本身的方法,(据我所知)没有办法(据我所知)具体地杀死那个goroutine或终止它中的循环(除非您可以在其中引发恐慌,但这是一个处理这个问题的糟糕方法)。
https://stackoverflow.com/questions/37997608
复制相似问题