停止阻塞的例程

时间:2019-12-10 14:25:12

标签: go channel 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
}

1 个答案:

答案 0 :(得分:1)

您无法从外部杀死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中非常常见的模式。

相关问题