avatar

目录
Go的 csp 并发模板

最近学习知识点的时候,包括读《GO 并发编程》的时候,发现频繁被提到的CSP 并发模型,便花了点时间记一下相关知识点,如有错误,欢迎指出。

Go 实现了两种并发形式。第一种就是大家普遍认知的:多线程共享内存。也就是 Java 或者 C++等语言中的多线程开发。另外一种是 Go语言特有的,
也是 Go 语言推荐的 CSP(Communication sequential processes)并发模型。CSP 讲究的是”以通信的方式来共享内存”。

普通的线程并发,就像是 JavaC++,他们线程间通信都是通过共享内存的方式来进行,非常典型的方式就是在访问共享数据时(数组呀、Map、对象啊)的时候,
需要通过锁来访问。当然,Java 也提供了一些线程安全的数据结构,比方说concurrentMapGo 语言中也有。

Go 的 CSP 并发模型,是通过goroutinechannel来实现的。

  • goroutineGo 语言中并发的执行单位,是一种轻量级的线程。
  • GO 语言中goroutine之间的通信机制,各个goroutine之间通过channel来传递信息,使得goroutine之间解耦。

在通信过程中,传数据channel <- data 和取数据<- channel一定要成对出现。

channel是引用类型,所以在他被初始化之前,它的值是nil,使用make函数进行初始化,初始化时,可以指定channel缓冲区的大小,这样就是一个
缓冲型的channel,不传,构造的就是一个非缓冲型的channel。对不带缓冲的channel进行的操作,实际上有点像“同步模式”,而带了缓冲称为“异步模式”。

Goroutine是实际并发执行的实体,他底层是使用协程coroutine实现并发,coroutine是一种运行在用户态的用户线程,它具有以下特点:

  • 用户空间,避免了内核态和用户态的切换导致的成本
  • 可以由语言和框架进行调度
  • 更小的栈空间允许创建大量的实例

参考文档

文章作者: Viola Tangxl
文章链接: https://violatangxl.github.io/2021/02/20/go-csp/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 椰子是只猫
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论