golang 併發編程基礎篇(一)

channel的阻塞的狀況

無緩衝channel的阻塞

  • 阻塞是一個聽上去逼格很高的一個詞,其實就是程序停了,杵在那兒等待程序繼續運行的條件,這個條件不發生的話,程序就死翹翹了。
  • 無緩衝channel阻塞的例子之常見的channel誤用

clipboard.png

  • 無緩衝channel阻塞的條件:發送方和接收方須要同時準備好,不然對方的協程就會阻塞。在ch <- "cmd.0"這個位置,由於沒有接收channel數據的協程,一直阻塞,因此,程序不會往下執行 go func,天然就會報錯:死鎖
  • 解決這個死鎖。只要先把接收方協程起了,再往channel發送就行,或者使用有緩衝的channel。

clipboard.png

有緩衝channel的阻塞

  • 接收channel數據的協程阻塞

clipboard.png

  • 發送channel數據的協程阻塞

clipboard.png

  • 有緩衝channel阻塞總結,channel爲空時,接收方阻塞,channel滿時,發送方阻塞。有緩衝channel的這個特性能夠用在構建鏈接池上。
相關文章
相關標籤/搜索