Golang學習筆記--協程和通道隨筆
併發:邏輯上具備同時處理多個任務的能力
並行:物理上在同一時刻執行多個併發任務
單執行緒的用協程做併發:協程在單個執行緒上通過主動切換來實現多個任務併發(協程上執行的多個任務本質上是依舊序列,加上可控自主排程,所以並不需要做到同步處理)
用多執行緒來實現分散式和負載均衡,減輕單程序垃圾回收壓力;用執行緒搶奪更多的處理器資源;用協程來提高處理器時間片利用率
關鍵字go並非執行併發操作,而是建立一個併發任務單元,新建任務被放置在系統佇列中,等待排程器安排合適系統執行緒去獲取執行權。當前流程不會阻塞,不會等待改任務啟動,且執行時也不保證併發任務的執行次序
runtime.Gosched:釋放執行緒去執行其他任務,當前任務被放回佇列,等待下次排程時恢復執行(該函式很少被使用,因為執行時會主動向長時間執行(10ms)的任務發出搶佔排程)
panic:是用來表示非常嚴重的不可恢復的錯誤(panic的作用就是平時異常,不過go沒有try..catch,panic一般就會導致程式掛掉,除非recover),panic會在defer執行完後向上傳遞
recover:捕獲panic的異常資訊,後續流程可以繼續走(如果沒有recover捕獲,全流程將會結束)


Goexit:可以立即終止整個呼叫堆疊,會執行延遲呼叫
os.Exit可以終止程序,但不會執行延遲呼叫
GO鼓勵使用CSP通道,以通訊來代替記憶體共享,實現併發安全(GO允許全域性變數、指標、引用型別這些非安全記憶體共享操作)
通道:同步模式下,傳送和接受雙方配對,然後直接複製資料給對方。如配對失敗,則置入等待佇列,直到另一方出現後才會被喚醒。非同步模式搶奪的則是資料緩衝槽。傳送方要求有空槽可供寫入,而接受方則要求有快取資料可讀。需求不符時,同樣加入等待佇列,直到另一方寫入資料或者騰出空槽後被喚醒
通道(goroutine之間的記憶體共享)
無緩衝的通道(channel),寫完後就會阻塞,這種情況只有其他協程中有對應的讀操作才會解除阻塞。而帶緩衝的通道在max+1才會阻塞
無緩衝:make(chan int);有緩衝:make(chan int,1)
time.Tick():做時間間隔,可用在定時任務(用於channel)
time.after():到時間發生的事情
通道和鎖的差別:通道傾向於解決邏輯層次的併發處理架構,而鎖則用來保護區域性範圍內的資料安全