Golang學(xué)習(xí)筆記--協(xié)程和通道隨筆

并發(fā):邏輯上具備同時處理多個任務(wù)的能力

并行:物理上在同一時刻執(zhí)行多個并發(fā)任務(wù)

單線程的用協(xié)程做并發(fā):協(xié)程在單個線程上通過主動切換來實現(xiàn)多個任務(wù)并發(fā)(協(xié)程上運行的多個任務(wù)本質(zhì)上是依舊串行,加上可控自主調(diào)度,所以并不需要做到同步處理)

用多線程來實現(xiàn)分布式和負載均衡,減輕單進程垃圾回收壓力;用線程搶奪更多的處理器資源;用協(xié)程來提高處理器時間片利用率

關(guān)鍵字go并非執(zhí)行并發(fā)操作,而是創(chuàng)建一個并發(fā)任務(wù)單元,新建任務(wù)被放置在系統(tǒng)隊列中,等待調(diào)度器安排合適系統(tǒng)線程去獲取執(zhí)行權(quán)。當(dāng)前流程不會阻塞,不會等待改任務(wù)啟動,且運行時也不保證并發(fā)任務(wù)的執(zhí)行次序

runtime.Gosched:釋放線程去執(zhí)行其他任務(wù),當(dāng)前任務(wù)被放回隊列,等待下次調(diào)度時恢復(fù)執(zhí)行(該函數(shù)很少被使用,因為運行時會主動向長時間運行(10ms)的任務(wù)發(fā)出搶占調(diào)度)

panic:是用來表示非常嚴重的不可恢復(fù)的錯誤(panic的作用就是平時異常,不過go沒有try..catch,panic一般就會導(dǎo)致程序掛掉,除非recover),panic會在defer執(zhí)行完后向上傳遞

recover:捕獲panic的異常信息,后續(xù)流程可以繼續(xù)走(如果沒有recover捕獲,全流程將會結(jié)束)



Goexit:可以立即終止整個調(diào)用堆棧,會執(zhí)行延遲調(diào)用

os.Exit可以終止進程,但不會執(zhí)行延遲調(diào)用

GO鼓勵使用CSP通道,以通信來代替內(nèi)存共享,實現(xiàn)并發(fā)安全(GO允許全局變量、指針、引用類型這些非安全內(nèi)存共享操作)

通道:同步模式下,發(fā)送和接受雙方配對,然后直接復(fù)制數(shù)據(jù)給對方。如配對失敗,則置入等待隊列,直到另一方出現(xiàn)后才會被喚醒。異步模式搶奪的則是數(shù)據(jù)緩沖槽。發(fā)送方要求有空槽可供寫入,而接受方則要求有緩存數(shù)據(jù)可讀。需求不符時,同樣加入等待隊列,直到另一方寫入數(shù)據(jù)或者騰出空槽后被喚醒

通道(goroutine之間的內(nèi)存共享)

無緩沖的通道(channel),寫完后就會阻塞,這種情況只有其他協(xié)程中有對應(yīng)的讀操作才會解除阻塞。而帶緩沖的通道在max+1才會阻塞

無緩沖:make(chan int);有緩沖:make(chan int,1)

time.Tick():做時間間隔,可用在定時任務(wù)(用于channel)

time.after():到時間發(fā)生的事情

通道和鎖的差別:通道傾向于解決邏輯層次的并發(fā)處理架構(gòu),而鎖則用來保護局部范圍內(nèi)的數(shù)據(jù)安全

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容