为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕娘9325324 2022-01-17 20:17:00
我正在使用一段有意无限循环的代码,我无法修改该代码。我想对该方法编写一些测试(例如,确保它在正确的时间触发操作),但我不想孤立一堆 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. 如果你在另一个例程中这样做,你只会让问题变得更糟。那么,有没有一种方法可以让我终止这种例行程序?(是的 - 我宁愿更改无限循环代码,但不能在这里)
查看完整描述

1 回答

?
繁星淼淼

TA贡献1775条经验 获得超11个赞

如果你不能改变循环代码,你就不能杀死循环。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 或终止其中的循环(除非您可以在其中触发恐慌,但这是一种糟糕的处理方式那个问题)


查看完整回答
反对 回复 2022-01-17
  • 1 回答
  • 0 关注
  • 160 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号