Golang?channel為什么不會(huì)阻塞的原因詳解
正文
最近在學(xué)通道channel,發(fā)現(xiàn)一個(gè)簡單的demo:
package main
import "fmt"
func main() {
chanInt := make(chan int)
go func() {
chanInt <- 100
}()
res := <-chanInt
fmt.Println(res)
}輸出結(jié)果是100,這個(gè)沒有問題。但是之前在學(xué)goroutine的時(shí)候有看到過一個(gè)例子:
package main
import "fmt"
func hello() {
fmt.Println("Hello Goroutine!")
}
func main() {
go hello() // 啟動(dòng)另外一個(gè)goroutine去執(zhí)行hello函數(shù)
fmt.Println("main goroutine done!")
}這個(gè)例子輸出的只有:main goroutine done! 并沒有Hello Goroutine!
看過解釋:在程序啟動(dòng)時(shí),Go程序就會(huì)為main()函數(shù)創(chuàng)建一個(gè)默認(rèn)的goroutine。當(dāng)main()函數(shù)返回的時(shí)候該goroutine就結(jié)束了,所有在main()函數(shù)中啟動(dòng)的goroutine會(huì)一同結(jié)束
那么這個(gè)解釋放到第一個(gè)例子為什么不適用了?
ps:我得理解是:運(yùn)行到res := <-chanInt這句會(huì)阻塞,直到協(xié)程寫入通道后,就馬上讀取,繼續(xù)執(zhí)行打印語句。不知道理解的對(duì)不對(duì)?
然后就是關(guān)于阻塞的情況,比如我把第一個(gè)例子改一下:
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,這個(gè)沒有問題。
然后再看一個(gè)例子:
func main() {
chanInt := make(chan int)
chanInt <- 100
res := <-chanInt
fmt.Println(res)
}這個(gè)例子就會(huì)死鎖,阻塞在chanInt <- 100這句,發(fā)現(xiàn)沒有接收者所以死鎖了,這邊不理解的是:睡眠10秒的時(shí)候,在這10秒里面為什么不會(huì)造成死鎖?而最后一個(gè)例子一運(yùn)行馬上報(bào)死鎖?更多關(guān)于Golang channel不會(huì)阻塞的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Prometheus Go client library使用方式詳解
這篇文章主要為大家介紹了Prometheus Go client library使用方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11
Go語言中進(jìn)行API限流的實(shí)戰(zhàn)詳解
API?限流是控制和管理應(yīng)用程序訪問量的重要手段,旨在防止惡意濫用、保護(hù)后端服務(wù)的穩(wěn)定性和可用性,下面我們就來看看如何在Go語言中具體實(shí)現(xiàn)吧2025-01-01
Nunu快速構(gòu)建高效可靠Go應(yīng)用腳手架使用詳解
這篇文章主要為大家介紹了如何使用Nunu快速構(gòu)建高效可靠Go應(yīng)用腳手架詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
Go垃圾回收提升內(nèi)存管理效率優(yōu)化最佳實(shí)踐
這篇文章主要為大家介紹了Go垃圾回收提升內(nèi)存管理效率優(yōu)化最佳實(shí)踐,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12

