Go的CSP并发模型

Go实现了两种并发形式。第一种是大家普遍认知的:多线程共享内存。其实就是Java或者C++等语言中的多线程开发。

另外一种是Go语言特有的,也是Go语言推荐的:CSP(communicating sequential processes)并发模型。 (推荐学习:go)

CSP并发模型是在1970年左右提出的概念,属于比较新的概念,不同于传统的多线程通过共享内存来通信,CSP讲究的是“以通信的方式来共享内存”。

请记住下面这句话:

Do not communicate by sharing memory; instead, share memory by communicating.“不要以共享内存的方式来通信,相反,要通过通信来共享内存。”

普通的线程并发模型,就是像Java、C++、或者Python,他们线程间通信都是通过共享内存的方式来进行的。

非常典型的方式就是,在访问共享数据(例如数组、Map、或者某个结构体或对象)的时候,通过锁来访问,因此,在很多时候,衍生出一种方便操作的数据结构,叫做“线程安全的数据结构”。

例如Java提供的包”java.util.concurrent”中的数据结构。Go中也实现了传统的线程并发模型。

Go的CSP并发模型,是通过goroutine和channel来实现的。

goroutine 是Go语言中并发的执行单位。有点抽象,其实就是和传统概念上的”线程“类似,可以理解为”线程“。

channel是Go语言中各个并发结构体(goroutine)之前的通信机制。 通俗的讲,就是各个goroutine之间通信的”管道“,有点类似于Linux中的管道。

生成一个goroutine的方式非常的简单:Go一下,就生成了。

go f();

通信机制channel也很方便,传数据用channel <- data,取数据用<-channel。

在通信过程中,传数据channel <- data和取数据<-channel必然会成对出现,因为这边传,那边取,两个goroutine之间才会实现通信。

而且不管传还是取,必阻塞,直到另外的goroutine传或者取为止。

有两个goroutine,其中一个发起了向channel中发起了传值操作。(goroutine为矩形,channel为箭头)

更多相关文章

  1. golang是多线程模式吗?
  2. 深入SQLite多线程的使用总结详解
  3. 关于SQLite多线程的用法详解
  4. 微服务通信的三种方法[每日前端夜话0xB5]
  5. 假装网络工程师28——MPLS跨AS通信optionC方案2
  6. 分布式链路追踪 SkyWalking 源码分析 —— Agent Remote 远程通
  7. 分布式链路追踪 SkyWalking 源码分析 —— Collector Remote 远
  8. 注册中心 Eureka 源码解析 —— 网络通信
  9. Docker容器跨主机通信之:直接路由方式

随机推荐

  1. 【小白自学笔记】【机器学习实战】【Pyth
  2. 使用多处理Pool.map()时不能pickle
  3. 参与一个Python的开源项目Python-QQ
  4. 初学者的Selenium自动化测试指南,基于Pyth
  5. python多版本共存配置
  6. Tensorflow部分函数功能
  7. python爬网页,做k线图
  8. python类的成员和装饰器
  9. 用python完成1-100的加法
  10. python多线程文件传输范例(C/S)