介绍并比较Actors与CSP并发模型

写在前面

最近翻了一下讲并发模型的书——七周七并发模型,包含了下面七种并发模型:线程与锁,函数式编程,Clojure,Actor,通信顺序进程(CSP),数据级并行,Lambda架构。

这篇博文把Actor和CSP两种模型简单介绍一下。

Actors模型

Actor模型,顾名思义,侧重的是Actor。每个Actor与其他Actor进行直接通信,不经过中介,且消息时异步发送和处理的。

Actor1 --> Actor2 --> Actor3
  ↓
Actor4

这里隐含着这几种意思:

  1. 可以把每个过程(微进程,比如Elixir中的Process)当做一个Actor,能与其他的Actor互不干扰地并发运行。
  2. 如果Actor1想作用Actor2,必须通过发送消息的方式给Actor2发送”邮件“(地址直接填Actor2的地址),至于Actor2是否接受这份”邮件“,是Actor2的事情。
  3. 每个Actor有一个小邮箱,任意Actor可以向自己的地址发送的信息都会放置在这个邮箱里;信息的投递和读取是两个过程,这就把Actor之间的交互解耦了。
  4. 如果Actor1想给Actor4发送信息,必须要显式地把Actor4的地址(指针或者其他能找到Actor4的柄)给Actor1,否则Actor1是不知道把信息传到哪里去的。因此,如果用Actor模型编写代码,会有很多过程的Id要传递,顺理成章地也就有了父进程和子进程的说法。

CSP模型

CSP是 Communicating Sequential Processes(通信顺序进程) 的简称。

Worker1 --> Channel --> Worker2

在CSP中,多了一个角色Channel,过程(比如goroutine,Worker1)与过程(Worker2)之间不直接通信,而是通过Channle进行通信。

这里面也隐含着几种意思:

  1. Channel是过程的中间媒介,Worker1想要跟Worker2发信息时,直接把信息放到Channel里(在程序中其实就是一块内存),然后Worker2在方便的时候到Channel里获取。
  2. Worker1和Worker2之间可以存在很多个Channel;在Golang中每个Channel定义不同的数据类型,即发送不同类型的消息的时候会用到多个不同的Channel。

比较

参考