概述
现如今的机器大都是多核的CPU架构,为了充分利用计算机的资源,我们要了解一些并发编程的思想。
大家应该都了解传统的并发编程模式,多线程编程。
传统的多线程编程实际上是使用的ShreadMemory
的方式来推动程序的前进。
为什么说new
一个thread
的方式是共享内存
呢?
有并发的地方就有竞争,传统多线程的并发模式使用locks(锁),condition variable(条件变量)
等同步原语来强制规定了进程的推进顺序,而这些同步原语本质上都是使用了在各个线程都可见的锁来实现,有一种全局变量的味道。(少数由硬件指令直接支持的除外,例如atomic_int。
那么除了直接控制thread
,使用shared memory
之外我们还有什么别的并发模型吗?
答案是有的~
今天我要分享的CSP和Actor模型都是基于消息传递的。(Message Passing)
CSP
CSP的是Communicating Sequential Processes (CSP)
的缩写,翻译成中文是顺序通信进程
,不过这个名字比较拗口,下文将用CSP来代替。
CSP的核心思想是多个线程之间通过Channel来通信(对应到golang中的chan结构),有点像是管道的概念。(Pipe)
Actor
Actor模式有一点类似面向对象模型,世界上所有的东西都被命名为Actor。
单个Actor会拥有一些状态,比如为名字是cat
的Actor可能被描述为:
name : cat
age : 3
type : British shorthair
color : white
....
到此为止好像和对象object
没有什么不同,但是Actor不会给外界提供任何的行为接口
.
比如cat.Move()
这是很自然的面向对象的写法,在Actor是不被允许的。
每一个Actor的属性绝不对外暴露,想和外界进行通信必须发送message
,所以每个Actor自身都有一个邮箱。
无论是CSP还是Actor模型,他们都完完全全贯彻了一句至理名言:
Don't communicate by sharing memory; share memory by communicating. (R. Pike)
CSP :Goroutine
golang中的goroutine我们可以理解为是一个thread
,但是它非常精简,调度的开销也非常小。
goroutine之间的通信使用名为chan
的数据结构,对应CSP模型中的channel。
goroutine的使用很简单,仅需要关键词go
即可启动一个goroutine