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

我正在使用一段有意无限循环的代码,我无法修改该代码。我想对该方法编写一些测试(例如,确保它在正确的时间触发操作),但我不想孤立一堆 go 例程。因此,我正在尝试找到一种可以杀死/中断该 goroutine 的方法。


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


func wrap(inf func()) func() {

  return func() {

    select {

    case inf():

    case <-time.After(5 * time.Second):

    }

  }

}


func main() {

  go wrap(inf())()

  // do things

}

我能想到的所有变化都不起作用。我正在考虑将它包装inf在一个写入通道(永远不会被调用)的函数中,或者带有 return 语句的东西。然后select可以从中读取。问题是你必须启动它。如果您在此例程中执行此操作,您将永远无法到达select. 如果你在另一个例程中这样做,你只会让问题变得更糟。


那么,有没有一种方法可以让我终止这种例行程序?


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


慕娘9325324
浏览 161回答 1
1回答

繁星淼淼

如果你不能改变循环代码,你就不能杀死循环。Go 是有意设计的,因此除了实际终止程序本身之外,没有办法从 goroutine 之外杀死 goroutine。如果您可以更改循环本身,那么杀死例程的典型方法是为 goroutine 提供退出通道,然后关闭(或发送)该通道以告知循环退出。例子:quitCh := make(chan struct{})go func() {&nbsp; &nbsp; for {&nbsp; &nbsp; &nbsp; &nbsp; select {&nbsp; &nbsp; &nbsp; &nbsp; case <-quitCh:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return&nbsp; &nbsp; &nbsp; &nbsp; // other cases to handle what you need to do&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}()// Once you're doneclose(quitCh) // goroutine exits但是如果没有某种方法将闭包行为编码到循环本身中,就无法(据我所知)专门杀死该 goroutine 或终止其中的循环(除非您可以在其中触发恐慌,但这是一种糟糕的处理方式那个问题)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go