Golang?channel為什么不會阻塞的原因詳解
正文
最近在學通道channel,發(fā)現(xiàn)一個簡單的demo:
package main import "fmt" func main() { chanInt := make(chan int) go func() { chanInt <- 100 }() res := <-chanInt fmt.Println(res) }
輸出結果是100,這個沒有問題。但是之前在學goroutine的時候有看到過一個例子:
package main import "fmt" func hello() { fmt.Println("Hello Goroutine!") } func main() { go hello() // 啟動另外一個goroutine去執(zhí)行hello函數(shù) fmt.Println("main goroutine done!") }
這個例子輸出的只有:main goroutine done! 并沒有Hello Goroutine!
看過解釋:在程序啟動時,Go程序就會為main()函數(shù)創(chuàng)建一個默認的goroutine。當main()函數(shù)返回的時候該goroutine就結束了,所有在main()函數(shù)中啟動的goroutine會一同結束
那么這個解釋放到第一個例子為什么不適用了?
ps:我得理解是:運行到res := <-chanInt這句會阻塞,直到協(xié)程寫入通道后,就馬上讀取,繼續(xù)執(zhí)行打印語句。不知道理解的對不對?
然后就是關于阻塞的情況,比如我把第一個例子改一下:
package main import ( "fmt" "time" ) func main() { chanInt := make(chan int) go func() { chanInt <- 100 }() time.Sleep(10 * time.Second) res := <-chanInt fmt.Println(res) }
多了time.Sleep(10 * time.Second)等待10秒鐘,10秒后輸出100,這個沒有問題。
然后再看一個例子:
func main() { chanInt := make(chan int) chanInt <- 100 res := <-chanInt fmt.Println(res) }
這個例子就會死鎖,阻塞在chanInt <- 100這句,發(fā)現(xiàn)沒有接收者所以死鎖了,這邊不理解的是:睡眠10秒的時候,在這10秒里面為什么不會造成死鎖?而最后一個例子一運行馬上報死鎖?更多關于Golang channel不會阻塞的資料請關注腳本之家其它相關文章!
相關文章
Golang map如何生成有序的json數(shù)據(jù)詳解
最近在學習Golang,發(fā)現(xiàn)了一個問題,覺著有必要給大家總結下,下面這篇文章主要給大家介紹了關于Golang map如何生成有序json數(shù)據(jù)的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友們下面來一起看看吧。2017-07-07golang struct, map, json之間的相互轉換
本文用于記錄我在 golang 學習階段遇到的類型轉換問題,針對的是 json 、map、struct 之間相互轉換的問題,感興趣的可以了解一下2021-06-06