go chan 缓存与阻塞
原文鏈接:Go語(yǔ)言第十一課 并發(fā)(三)Channel緩存與阻塞
Channel的緩存
前面介紹過(guò)channel的創(chuàng)建方法:
channel_test := make(chan string)
其實(shí)它完整的寫法應(yīng)該是:
channel_test := make(chan string,0)
這種容量為0的channel就是無(wú)緩存channel。對(duì)應(yīng)地,我們也可以創(chuàng)建有緩存channel
channel_test := make(chan string,1)
無(wú)緩存channel
channel是否有緩存最根本的不同是阻塞策略的不同。
無(wú)緩存的channel會(huì)在讀寫兩端產(chǎn)生阻塞即:
當(dāng)對(duì)一個(gè)無(wú)緩存的channel讀時(shí),若數(shù)據(jù)尚未到達(dá),則讀協(xié)程阻塞;當(dāng)對(duì)一個(gè)無(wú)緩存的channel寫時(shí),若數(shù)據(jù)尚未消費(fèi),則寫協(xié)程阻塞。
基于此,無(wú)緩存的channel也成為同步channel
需要特別注意的是,當(dāng)數(shù)據(jù)尚未被消費(fèi)時(shí),接收者接收數(shù)據(jù)發(fā)生在喚醒發(fā)送者協(xié)程之前!
有緩存channel
帶緩存的channel實(shí)際上是一個(gè)阻塞隊(duì)列。對(duì)隊(duì)列的寫總發(fā)生在隊(duì)尾,隊(duì)列滿時(shí)寫協(xié)程阻塞;對(duì)隊(duì)列的讀總發(fā)生在隊(duì)尾,隊(duì)列空時(shí)讀協(xié)程阻塞。
內(nèi)置函數(shù)cap(channel)可以讀取隊(duì)列的總長(zhǎng)度。
內(nèi)置隊(duì)列l(wèi)en(channel)可以讀取隊(duì)列的有效長(zhǎng)度(已使用長(zhǎng)度)。
有緩存的channel的最大意義在于生產(chǎn)和消費(fèi)可以解耦。
協(xié)程泄漏
協(xié)程永遠(yuǎn)阻塞,無(wú)法退出。即協(xié)程泄漏。協(xié)程的泄漏無(wú)法被自動(dòng)回收,所以要極力避免!要確保每個(gè)協(xié)程都可以正常退出。
轉(zhuǎn)載于:https://www.cnblogs.com/wangjq19920210/p/11527106.html
總結(jié)
以上是生活随笔為你收集整理的go chan 缓存与阻塞的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: go 多线程并发 queue demo
- 下一篇: Kubernetes 编写自定义 con