go隨聊-chan使用的坑
阿新 • • 發佈:2018-11-01
Go中chan是分阻塞和非阻塞(帶緩衝)的
建立非緩衝的chan
ch:=make(chan int)
ch<-1
fmt.Println("run")
執行會報:fatal error: all goroutines are asleep - deadlock! 因為這種方式建立的是非緩衝的chan
建立帶緩衝的chan
ch:=make(chan int,1)
ch<-1
fmt.Println("run")
緩衝數目少了同樣也會阻塞
ch:=make(chan int,1) ch<-1 ch<-1 fmt.Println("run")
執行會報:fatal error: all goroutines are asleep - deadlock!
使用chan進行協程優雅退出
go func(){
for {
select {
case <-time.After(time.Second * 10):
case <-this.signal:
this.signal<-1
return
}
}
}()
func (this *xxxx) Stop() { this.signal<-1 <-this.signal close(this.signal) }