亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

停止阻塞 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 關注
  • 129 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號