最近在開發過程當中遇到了幾個goroutine通訊的問題,我覺得這幾個問題非常具有代表性,因此拿出來和大家分享一下。
開發過程當中有遇到這樣的一種情況,需要檢查channel是否關閉,如果關閉則不進行相應操作,否則會panic等現象。在golang的select語法當中,default分支可以解決上述問題,請看如下例子:
closechan := make(chan int,0)
dchan := make(chan int,0)
select
go func() }}
}
上述的方式可以在處理dchan
的資料的時候處理異常並不再接受來自dchan的資料。
但是我們需要考慮一種情況,如果在dosomething(data)
的過程當中,出現異常(4)
,那麼不允許往dchan
傳送資料,並將closechan
關閉。在(5)
關閉closechan
之後就不會再進入(1)
的default流程了。
可是這還有問題,那就是如果dosomething(data)
處理的過程當中,新來了乙個資料進入到了dchan
,那麼將會在(1)
和(2)
處阻塞,當dosomething(data)
處理完之後,還會多處理一次異常情況,也就是說在(5)
處將會close(closechan)
兩次,這樣會導致panic: close of closed channel
,所以我們需要在(5)
再寫乙個相應的default
處理邏輯:
go func()
} }}
}
當我們在使用bufferd-channel的時候,我們可能需要檢查當前的channel是否已經滿了,因為我們可能不希望此時goroutine阻塞,所以可以採用如下的方式進行處理:
cc := make(chan int, 1)
cc <- data1
select
在研究併發map的時候,會考慮到一種shard-map的實現方式,在讀取map中的值的時候,需要通過多個小map中獲取完整的map值,可以利用channel實現fan-in:
func fanin(chans chan int, out chan int)
wg.add(len(chans))
for _, ch := range chans
wg.done()
}(ch)
}wg.wait()
close(out)
}
不知道不知道
函式分析 希爾伯特 哥德爾不完備定理 哥德爾不完全性定理一舉粉碎了數學家兩千年來的信念。他告訴我們,真與可證是兩個概念。可證的一定是真的,但真的不一定可證。某種意義上,悖論的陰影將永遠伴隨著我們。無怪乎大數學家外爾發出這樣的感嘆 上帝是存在的,因為數學無疑是相容的 魔鬼也是存在的,因為我們不能證明這...
不知道不知道
函式分析 希爾伯特 哥德爾不完備定理 哥德爾不完全性定理一舉粉碎了數學家兩千年來的信念。他告訴我們,真與可證是兩個概念。可證的一定是真的,但真的不一定可證。某種意義上,悖論的陰影將永遠伴隨著我們。無怪乎大數學家外爾發出這樣的感嘆 上帝是存在的,因為數學無疑是相容的 魔鬼也是存在的,因為我們不能證明這...
你不知道的 和
開發中,編寫有一定逼格的 是每個程式猿都追求的。經常用來判斷的符號 和 也經常用來定義變數哦,你知道嗎?邏輯與 在有乙個運算元不是布林值的情況下,就不一定返回布林值。比如以下情況 1 第乙個運算元是物件,返回第二個數 var myinfo console.log myinfo 2 輸出22 第二個運...