使用select解決從管道取數據的阻塞問題

package main
import (
	"fmt"
	"time"
)

func main() {

	//使用select可以解決從管道取數據的阻塞問題

	//1.定義一個管道 10個數據int
	intChan := make(chan int, 10)
	for i := 0; i < 10; i++ {
		intChan<- i
	}
	//2.定義一個管道 5個數據string
	stringChan := make(chan string, 5)
	for i := 0; i < 5; i++ {
		stringChan <- "hello" + fmt.Sprintf("%d", i)
	}

	//傳統的方法在遍歷管道時,如果不關閉會阻塞而導致 deadlock

	//問題,在實際開發中,可能我們不好確定什麼關閉該管道.
	//可以使用select 方式可以解決
	
	for {
		select {
			//注意: 這裏,如果intChan一直沒有關閉,不會一直阻塞而deadlock
			//,會自動到下一個case匹配
			case v := <-intChan : 
				fmt.Printf("從intChan讀取的數據%d\n", v)
				time.Sleep(time.Second)
			case v := <-stringChan :
				fmt.Printf("從stringChan讀取的數據%s\n", v)
				time.Sleep(time.Second)
			default :
				fmt.Printf("都取不到了,不玩了, 程序員可以加入邏輯\n")
				time.Sleep(time.Second)
				return 
			
		}
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章