3 回答

TA貢獻(xiàn)1868條經(jīng)驗(yàn) 獲得超4個(gè)贊
這行得通。
package main
import (
"fmt"
"time"
)
func main() {
tick := time.Tick(100 * time.Millisecond)
boom := time.After(500 * time.Millisecond)
stop := make(chan int)
for {
select {
case <-stop:
fmt.Println("Stopped!")
return
case <-tick:
fmt.Println("tick.")
case <-boom:
fmt.Println("BOOM!")
close(stop)
default:
fmt.Println(" .")
time.Sleep(50 * time.Millisecond)
}
}
}
輸出如下。
tick.
.
.
tick.
.
.
tick.
.
.
tick.
BOOM!
Stopped!

TA貢獻(xiàn)1816條經(jīng)驗(yàn) 獲得超6個(gè)贊
Go 編程語(yǔ)言規(guī)范說(shuō)明了關(guān)于發(fā)送到頻道的以下內(nèi)容:
通信阻塞,直到發(fā)送可以繼續(xù)。如果接收器準(zhǔn)備好,則可以在無(wú)緩沖通道上進(jìn)行發(fā)送。如果緩沖區(qū)中有空間,則可以繼續(xù)緩沖通道上的發(fā)送。
因此,當(dāng)您的代碼到達(dá)stop <- 0
它時(shí),會(huì)阻塞等待另一個(gè) goroutine 從通道中讀取,而這永遠(yuǎn)不會(huì)發(fā)生(您case <- stop:
在同一個(gè) go 例程中,因此不活動(dòng))。
有幾種方法可以解決這個(gè)問(wèn)題:
使用緩沖通道(例如
stop := make(chan int, 1)
)。在另一個(gè) go 例程中等待停止(示例)
關(guān)閉頻道而不是向其發(fā)送內(nèi)容 (
close(stop)
)。
注意:由于您的應(yīng)用程序的編寫方式,這些選項(xiàng)都不會(huì)真正停止它,因?yàn)槟?for 循環(huán)永遠(yuǎn)不會(huì)退出(添加break
或return
退出)。

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超7個(gè)贊
當(dāng) BOOM 發(fā)生時(shí),主 goroutine 會(huì)等待寫入停止通道。但是沒(méi)有其他 goroutine 等待從中讀取,所以這是一個(gè)死鎖。
如果您使停止通道成為容量為 1 的緩沖通道,那么它將能夠?qū)懭胨⑶蚁乱淮蔚鷮⒆x取。或者干脆關(guān)閉頻道。
- 3 回答
- 0 關(guān)注
- 197 瀏覽
添加回答
舉報(bào)