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

停止阻塞 goroutine

停止阻塞 goroutine

Go
长风秋雁 2023-08-14 14:32:16
我怎样才能杀死一个正在阻塞的 goroutine。一个想法是从主机函数返回将是一个解决方案,但我不确定这是否会杀死 goroutine。func myFunc() int {   c := make(<-chan int)   go func(){      for i := range c {      // do stuff      }   }()   return 0 // does this kills the inner goroutine?}有更好的解决方案吗?例如,如果像这样的东西可以工作就好了,但是由于它的阻塞而不能:func myFunc() int {   c := make(<-chan int)   closeChan := make(chan int)   go func() {      select {      case close := <-closeChan:         return 0      default:         for i := range c {            // do stuff         }      }   }()   closeChan<-0   // other stuff}
查看完整描述

1 回答

?
温温酱

TA贡献1752条经验 获得超4个赞

你不能从外部杀死一个 Goroutine——你甚至不能引用一个特定的 Goroutine;您也不能中止阻塞操作。但是,您可以将其移到for外部:


go func() {

   for  {

       select {

       case close := <-closeChan:

          return 0

       case i,ok := <-c:

         // do stuff

         if !ok {

             // channel is closed & empty

             return 0

         }

       }

   }

}()

这将永远循环,每次迭代都会等待两个通道上的消息;无论哪个先收到消息都将被处理,然后重复循环。这是 Go 中非常常见的模式。


查看完整回答
反对 回复 2023-08-14
  • 1 回答
  • 0 关注
  • 82 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信