关于Go语言 chan的理解

关于Go语言 chan的理解

go语言高级编程中示例了很多通道的使用方法,很有趣。这里想从元能力上总结一下chan的作用。

首先通道是什么?

从顶层建设层面的意义来看,go语言发明人的名言:“不要通过共享内存来通信,而应该通过通信来共享内存”。

可以看出chan的作用是为了实现通信从而达到信息在不同的线程(go程)之间交换。那么chan的元能力就是信息共享

我们来看看编程语言层面上提供了哪些支持
1、通道一端生产,一端消费,两端可以有不同的go程同时进行,但是同一个值只有一个go程能消费到
2、如果一个无消费者go程存在,或者来不及消费,则生产者go程阻塞,反之亦然
3、通道具有缓存容量,当消费者未消费时,生产者可以先写入缓存

如果我们把多个go程想象成一个分布式系统,这些特性提供了哪些应用层面的支持呢?可以看出,chan的作用就像是一个为分布式系统服务的高可用队列服务

一个这样的服务能实现的功能,chan都可以用上。

顺便多说一嘴,为什么不要共享内存来通信呢?我猜应该是为了解决多线程读写时的临界区冲突会消耗掉大量的资源吧。

查了一下,确实如此这篇文章指出,一些语言通过共享内存的方式来通信造成抢锁等问题,效率低下,python的queue队列是一种线程安全的数据结构相比之下就要好很多,而go语言则通过并发原语goroutine和channel利用通信来实现内存共享。

发表评论

邮箱地址不会被公开。 必填项已用*标注