我怎樣才能殺死一個正在阻塞的 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 中非常常見的模式。
- 1 回答
- 0 關注
- 129 瀏覽
添加回答
舉報
0/150
提交
取消