演员模型

在电脑科学中，演员模型（）是一种并行运算上的模型。「演员」是一种程式上的抽象概念，被视为并行运算的基本单元：当一个演员接收到一则讯息，它可以做出一些决策、建立更多的演员、传送更多的讯息、决定要如何回答接下来的讯息。演员可以修改它们自己的私有状态，但是只能通过消息间接的相互影响（避免了基于锁的同步）。
演员模型在1973年于、Peter Bishop及Richard Steiger的论文中提出。它已经被用作并发计算的框架和并发系统的基础。演员模型和其他类似工作的关系讨论可见于。
基本概念.
演员模型推崇的哲学是“一切皆是演员”，这与面向对象编程的“一切皆是对象”类似。
演员是一个运算实体，响应接收到的消息，相互间是并发的：
以上动作不含有顺序执行的假设，因此可以并行进行。
发送者与已发送通信的解耦，是演员模型的根本优势，演员模型启用了异步通信并将控制结构当作消息传递的模式。
消息接收者是通过地址区分的，有时也被称作“邮件地址”。因此演员只能和它拥有地址的演员通信。它可以通过接收到的信息获取地址，或者获取它创建的演员的地址。
演员模型的特征是，演员内部或相互之间的计算本质上是并发性的，演员可以动态创建，演员地址包含在消息中，交互只有通过直接的异步消息传递通信，不限制消息到达的顺序。
历史.
演员模型受到了Lisp、Simula、Smalltalk-72、和分组交换的影响。其发展“受到由几十、几百、甚至几千个独立微处理机构成的高度并行计算机器的前景所推动，其中的每个处理机都有自己局部内存和通信处理器，它们通过高性能网络进行通信。”此后随着采用多核和计算机架构的大规模并发计算的出现，人们已经重新燃起了对演员模型的兴趣。
在Hewitt、Bishop和Steiger的1973年刊物之后，在1975年博士论文中，为演员模型开发出了一种操作语义。和Hewitt在1977年发表了演员系统的公理法则。其他主要的里程碑包括：的1981年学位论文，它介入了基于的指称语义；还有的1985年学位论文，它进一步发展出基于transition的语义模型，从而补充了Clinger的模型。这些工作促成了的全面发展。
主要的软件实现工作，由麻省理工学院的消息传递语义小组完成，其成员包括Russ Atkinson、Giuseppe Attardi、Henry Baker、Gerry Barber、Peter Bishop、Peter de Jong、Ken Kahn、Henry Lieberman、Carl Manning、Tom Reinhardt、Richard Steiger和Dan Theriault。分别由加州理工学院的Chuck Seitz和麻省理工学院的Bill Dally领导的研究小组，致力于构造新的计算机架构，用以进一步发展演员模型中的消息传递。有关工作详见。
演员模型的研究，已经开展于加州理工学院、京都大学、、MIT人工智能实验室、斯坦福国际研究所、斯坦福大学、伊利诺伊大学厄巴纳-香槟分校、巴黎第六大学、比萨大学、东京大学研究室、荷兰数学和计算机科学研究学会和其他一些地方。
使用演员模型编程.
一些编程语言使用了演员模型或变种。这些语言包括：
演员模型库及框架.
演员模型库及框架，允许用户在没有内置演员模型的语言中进行编程。这些框架包括：
注意这里没有列出全部框架和库。
并发编程语言用例.
尽管Erlang语言设计者并未如此表述，因其进程间通信是通过消息传递系统运作，它一般被引证为采用演员模型的典型代表之一。在Erlang中，所有进程都有一个自己的“邮箱”，它是从其他进程已经发送过来而仍未被消费的消息的队列。进程使用codice_1原语来检索匹配预期模式的消息。一个消息处理例程针对每个模式依次测试这些消息，直到其中有一个匹配。在消息被消费并从邮箱中移除之时进程恢复执行。消息可以包含任何Erlang结构，包括原始类型（整数，浮点数、字符、原子）、元组、列表和函数。
下面例子展示了Erlang对分布式进程的内建支持：
% 建立一个进程并启用函数web:start_server(Port, MaxConnections)
ServerProcess = spawn(web, start_server, [Port, MaxConnections]),
% 在机器RemoteNode上建立一个远程进程并启用函数web:start_server(Port, MaxConnections)
RemoteProcess = spawn(RemoteNode, web, start_server, [Port, MaxConnections]),
% (异步的)发送消息到ServerProcess。消息包含一个元组，它具有原子"pause"和数"10"。
ServerProcess ! {pause, 10},
% 接收发给这个进程的消息
receive
 a_message -&gt; do_something;
 {data, DataContent} -&gt; handle(DataContent);
 {hello, Text} -&gt; io:format("Got hello message: ~s", [Text]);
 {goodbye, Text} -&gt; io:format("Got goodbye message: ~s", [Text])
end.
原型的演员编程语言.
Hewitt在2006年发表了一个原型的演员编程语言，用意在于直接表达演员行为的重要方面。消息采用如下表示法：
编程语言的语义是通过将每个程序构造确定为有自己行为的演员来定义的。执行是通过在执行期间让Eval消息在程序构造之间传递来建模的。
环境演员.
每个Eval消息都有一个充当环境的演员的地址，它能够进行标识符与值的绑定（binding）。environment演员是不可变的（immutable），也就是不变更的。
上述环境演员建造在EmptyEnvironment演员之上，它在接收到Request[Lookup[identifier] customer]的时候，发送给customer一个Thrown[NotFound[identifier]]。当它收到Bind请求的时候，EmptyEnvironment表现的如同上述环境演员。
表达式.
原型语言有如下种类的表达式，这里的通信包括Request[...]、Returned[...]和Thrown[...]，这里的消息包括Eval[...]、Bind[...]和Lookup[...]：
例子程序.
下面是简单的存储单元格（cell）的例子脚本（script），它可以包含任何演员地址：
上述脚本将建立一个存储单元格，它采用的行为ReadWrite定义如下：
例如，下列表达式建立一个单元格x，具有初始内容5，并接着并发的向它写值7和9。
上述表达式的值是5、7或9。
影响.
演员模型在并发计算的理论发展和实践软件开发中都有影响。
理论.
演员模型影响了π-演算和随后的进程演算的发展。在Robin Milner的图灵奖获奖演说中，他写到：
纯lambda演算现在只使用两种东西来建造：项和变量。我们在进程演算上也能实现同样的经济性吗？Carl Hewitt凭借其演员模型，很久以前就应对了这个挑战；他宣告了值、在值上的算子和进程，都应该是同一种东西：即演员。
这个目标打动了我，因为它蕴涵了表达式有着同质性和完整性 ... 但是很久以后我才明白了如何依据代数演算来达成这个目标 ...
因此本着Hewitt的精神，我们的第一步，就是要求由项指示或由名字访问的所有东西，包括值、寄存器、算子、进程、对象，都是同一种东西；它们都应当是进程。
实践.
演员模型在商业实践中已经有了巨大的影响。例如，Twitter将演员用于可伸缩性应用。还有，Microsoft在其开发的异步代理库中使用了演员模型。