golang对channel的使用,可以类比现实生活中的什么情景?

本人是golang萌新,第一次接触channel,有点抽象,也没怎么接触过c/c++,请问日常生活中,有什么可以类比的呢?

阅读 3.4k
3 个回答

可以类比到生活中的管道或者是流水线传送带,channel可以写入或者读取,channel写入的时候就像是往传送带上放入货物,读取channel就像是从传送带上取货物。
channel分为buffered和立即阻塞的,取决于你是如何初始化这个channel的:
缓冲channel:

var c = make(chan int,10)

这样的channel就像容量为10的传送带,上面可以放10个货物,如果放满了,就不能再放了(go程阻塞),只能等取走之后才可以继续放(go程继续执行)。
而非缓冲的channel:

var c = make(chan int)

这样的channel就像就只能放1个货物传送带,放入货物直到这个货物被取走,这个工作流程都是停止(阻塞)在这里的。在goroutine中的表现就是该go程被阻塞。

var c = make(chan int,1)

这样的channel就像就只能放1个货物传送带,放入货物直到这个货物被取走,这个工作流程都是停止(阻塞)在这里的。在goroutine中的表现就是该go程被阻塞。


var c = make(chan int)

这样定义的channel是无缓冲的,更类似于我们买票的窗口,传递和接受都是阻塞的,只有双方都准备好才能继续下一次操作。

对,流水线,或者说消息队列也可以,上面的答案已经很好了,golang的channel就是对现实中流水线的完美模拟,
流水线,顾名思义,通过合理分段、并行作业,是现代工业生产高效运作的基础。
深入了解可以参考这篇文章,收获很大,墙裂推荐
https://segmentfault.com/a/11...

但是,话说回来,golang的channel实际上并不高效,不宜过度依赖,可以参考heka项目(消息队列):
https://github.com/mozilla-se...
因为依赖channel特性好像已经被抛弃了

推荐问题
宣传栏