Welcome

首页 / 软件开发 / .NET编程技术 / ActorLite:一个轻量级Actor模型实现(上)

ActorLite:一个轻量级Actor模型实现(上)2011-04-05 博客园 Jeffrey ZhaoActor模型

Actor模型为并行而生,具Wikipedia中的描述,它原本是为大量独立的微型处理器所 构建的高性能网络而设计的模型。而目前,单台机器也有了多个独立的计算单元,这就是 为什么在并行程序愈演愈烈的今天,Actor模型又重新回到了人们的视线之中了。Actor模 型的理念非常简单:天下万物皆为Actor,Actor之间通过发送消息进行通信。Actor模型 的执行方式有两个特点:

每个Actor,单线程地依次执行发送给它的消息。

不同的Actor可以同时执行它们的消息。

对于第1点至今还有一些争论,例如Actor是否可以并行执行它的消息,Actor是否应该 保证执行顺序与消息到达的一致(祥见Wikipedia的相关字段)。而第2点是毋庸置疑的, 因此Actor模型天生就带有强大的并发特性。我们知道,系统中执行任务的最小单元是线 程,数量一定程度上是有限的,而过多的线程会占用大量资源,也无法带来最好的运行效 率,因此真正在同时运行的Actor就会少很多。不过,这并不影响我们从概念上去理解“ 同一时刻可能有成千上万个Actor正在运行”这个观点。在这里,“正在运行”的含义是 “处于运行状态”。

Actor模型的使用无处不在,即使有些地方并没有明确说采用的Actor模型:

Google提出的Map/Reduce分布式运算平台

C#,Java等语言中的lock互斥实现

传统Email信箱的实现

……

Actor模型的现有实现

提到Actor模型的实现就不得不提Erlang。Erlang专以Actor模型为准则进行设计,它 的每个Actor被称作是“进程(Process)”,而进程之间唯一的通信方式便是相互发送消 息。一个进程要做的,其实只是以下三件事情:

创建其他进程

向其他进程发送消息

接受并处理消息

例如《Programming Erlang》中的一段代码:

loop() ->
receive
{From, {store, Key, Value}} ->
put(Key, {ok, Value}),
From ! {kvs, true},
loop();
{From, {lookup, Key}} ->
From ! {kvs, get(Key)},
loop()
end.