goroutine和channel

近期在學習golang的goroutine和channel時候有一些疑惑:golang

  1. 帶緩衝的channel和不帶緩衝的channel有什麼區別?
  2. goroutine和主進程的有哪些影響和關係?
  3. 多個goroutine的執行順序是怎麼樣的?

經過下面的代碼咱們能夠獲得答案併發

第一個例子

  1. 帶緩衝的channel和不帶緩衝的channel有什麼區別?
    沒有緩衝的channel必須等到有接收者纔會執行後面的代碼(阻塞)
  2. goroutine和主進程的有哪些影響和關係?
    主進程若是退出會致使全部的goroutine中斷退出。
  3. 多個goroutine的執行順序是怎麼樣的?
    多個goroutine會併發執行。

第二個例子

輸出:函數

Washington Tripoli London Beijing tokyo

main() 函數中啓動了兩個協程:sendData() 經過通道 ch 發送了 5 個字符串,getData() 按順序接收它們並打印出來。
若是 2 個協程須要通訊,你必須給他們同一個通道做爲參數才行。學習

嘗試一下若是註釋掉 time.Sleep(1e9) 會如何。code

咱們發現協程之間的同步很是重要:

  • main() 等待了 1 秒讓兩個協程完成,若是不這樣,sendData() 就沒有機會輸出。
  • getData() 使用了無限循環:它隨着 sendData() 的發送完成和 ch 變空也結束了。
  • 若是咱們移除一個或全部 go 關鍵字,程序沒法運行,Go 運行時會拋出 panic:
---- Error run E:/Go/Goboek/code examples/chapter 14/goroutine2.exe with code Crashed ---- Program exited with code -2147483645: panic: all goroutines are asleep-deadlock!

爲何會這樣?運行時會檢查全部的協程(也許只有一個是這種狀況)是否在等待(能夠讀取或者寫入某個通道),意味着程序沒法處理。這是死鎖(deadlock)形式,運行時能夠檢測到這種狀況。協程

注意:不要使用打印狀態來代表通道的發送和接收順序:因爲打印狀態和通道實際發生讀寫的時間延遲會致使和真實發生的順序不一樣。blog

相關文章
相關標籤/搜索