首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在无限循环中杀死方法(golang)

在无限循环中杀死方法(golang)
EN

Stack Overflow用户
提问于 2016-06-23 16:56:55
回答 1查看 2.3K关注 0票数 1

我正在处理一段有一个有意的无限循环的代码,我不能修改该代码。我想编写一些关于该方法的测试(例如,确保它在正确的时间触发操作),但我不想孤立一堆go例程。所以我想找到一种方法来杀死/打断那条戈鲁蒂。

我正在考虑将它封装在一个包装函数中,这个函数会在信号发出后杀死它。像这样(不起作用)。

代码语言:javascript
复制
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。如果你在另一个例行公事中这样做,你只会使问题变得更糟。

那么,有什么办法可以让我放弃这个常规吗?

(是的--我宁愿修改无限循环代码,但这里不能)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-23 17:18:10

如果不能更改循环代码,就不能关闭循环。Go是故意设计的,除了真正终止程序本身之外,没有办法从goroutine之外杀死一个goroutine。

如果可以更改循环本身,则杀死例程的典型方法是向goroutine提供退出通道,然后关闭(或发送)该通道,通知循环退出。示例:

代码语言:javascript
复制
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或终止它中的循环(除非您可以在其中引发恐慌,但这是一个处理这个问题的糟糕方法)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37997608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档