猿问

停止阻塞 goroutine

我怎样才能杀死一个正在阻塞的 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

}


长风秋雁
浏览 87回答 1
1回答

温温酱

你不能从外部杀死一个 Goroutine——你甚至不能引用一个特定的 Goroutine;您也不能中止阻塞操作。但是,您可以将其移到for外部:go func() {&nbsp; &nbsp;for&nbsp; {&nbsp; &nbsp; &nbsp; &nbsp;select {&nbsp; &nbsp; &nbsp; &nbsp;case close := <-closeChan:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return 0&nbsp; &nbsp; &nbsp; &nbsp;case i,ok := <-c:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// do stuff&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if !ok {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// channel is closed & empty&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return 0&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}&nbsp; &nbsp; &nbsp; &nbsp;}&nbsp; &nbsp;}}()这将永远循环,每次迭代都会等待两个通道上的消息;无论哪个先收到消息都将被处理,然后重复循环。这是 Go 中非常常见的模式。
随时随地看视频慕课网APP

相关分类

Go
我要回答