Origin X Documentation

天行有常,不为尧存,不为桀亡。——荀子《天论》

Actor模型

提到Actor模型就不得不提CSP模型(Communicating Sequential Processes)模型,本章主要介绍Actor模型,同时对比一下Actor模型和CSP模型的一些小区别,希望读者从概念上先理解Actor模型,关于Actor模型的更底层的理论,读者可以参考《并发之痛Thread、Gorouting、Actor》,这里我就再赘述了。

1. Actor模型

在Actor并发模型中,它的主角是Actor,实际上它类似于一种Worker线程,它们之间通过消息相互通信(在Vert.x中,它们之间的消息介质就是Event Bus),这些消息的发送是异步的,可并行。

Actor模型可用上述图来描述,且满足一定的原理:

Actor模型的代表:Akka/Erlang、以及我们将要学习的Vert.x都是使用的Actor模型。

2. CSP模型

另外一种流行的模型是CSP模型,也就是Channel模型,在这种模型中,在Worker和Worker之间引入了一种新的机制,称为Channel,这种模型的Worker线程相互之间是通过Channel进行消息发布、以及监听,而且Worker之间相互透明:它既不知道消息发送给谁,也不知道自己消费的消息是哪一个Worker发出的。

Go语言就是使用的这种CSP模型,它利用协程Goroutine和通道Channel实现:

3. 进程、线程、协程

这里不解释并发(Concurrency)和并行(Parallelism)的区别,先看看三个基本概念:进程、线程、协程【Reference】。

思考:

实际上,从进程、到线程、到协程,都是为了最大化地利用计算机本身的资源不断进步的一个概念,读者会发现其思路是一致的:

  • 进程是为了提高CPU的利用率,减少CPU资源调度过程中的上下文切换,它是操作系统中的最小单位。
  • 线程则是为了提高进程内的资源利用率,突破进程本身的缺陷,在进程内部实现并发,它是进程内的最小单位。
  • 协程(又称微线程)往下再走一级,提高线程内的资源利用率,减少上下文切换的开销,突破线程本身的缺陷,它是线程内的最小单位。

总地来说,主要是从提高资源利用率、减少上下文(进程、线程、协程的上下文不一样)切换的开销、减少IO的阻塞或者更加高效处理阻塞,同时将每一个级别的使用并行化。

【注:最后需要说明的一点是,线程不一定比进程快,而协程不一定比线程快,它们只是理论上的一种资源利用的突破,而具体的业务场景有时候还是会影响到三者的效率。至于在协程之后会不会出现另外一种X程,这个只能拭目以待,毕竟这个过程是一步一步突破而来的。】

4. Summary

本文主要是为大家介绍Actor模型,顺带介绍CSP模型,关于并发的相关细节大家还是可以参考最开始推荐的文章,了解更多并发相关的知识点,由于Vert.x中使用了Actor模型,那么对Actor模型的理解对读者而言可帮助理解Verticle在Vert.x中的概念。这也是本身支线剧情介绍Actor模型的原因。