Erlang:Actor

并发

Joe Armstrong:

con_and_par.jpg

传统并发

编程语言通常通过使用线程提供并发操作。由于线程使用缺乏原子性,因此需要锁定原语(如信号量或互斥量)。这可能会造成难以编程和调试的情况,例如死锁。

并行化的思考

计算速度继续向摩尔定律的方向发展,并且考虑到编写当时利用处理器和体系结构的并发程序的复杂性,考虑以这种方式编写软件并不总是值得的。但有人猜测我们可能会开始看到潜在的物理限制:只有这么多的晶体管可以继续适应更小的物理区域。因此,并行化的使用变得越来越有吸引力。Amdahl定律基本上为程序的并行化提供了一个很好的经验法则:

AmdahlsLaw.svg.png

Actor 模型

  • Actor是一个并发原语,不与另一个actor共享资源。它们通过消息传递共享状态/数据。
  • actor是具有邮箱和行为的实体。它需要一条消息,然后可以向其他actor发送消息,创建新的actor,并返回另一个描述其下一个行为的actor。
  • actor模型是一个思考,建模和构建分布式并发系统的框架。

概念

  1. actor之间没有共享状态
  2. 函数异步
  3. 消息传递的信息(分享/改变状态的唯一方法是通过此消息传递)

创建

在Erlang中创建一个进程,只需调用spawn,它将返回一个进程ID。使用spawn/3spawn(Module, Function, Args) -> pid()

1
2
3
4
-module(actor_file)
...
start() - >
spawn(actor_file,run,[]).

start/0这里调用返回pid:

1
2
3
4
1> c(actor_file).
2> Pid = actor_file:start().
3> Pid.
<0.80.0>

它不是操作系统定义中的一个过程。这是一个Erlang进程,因此它在Erlang VM中运行。它在用户空间中运行,而不是绑定到内核,因此由Erlang Scheduler安排。

检查一下我们的进程使用了​​多少内存:

1
2
1> {_,Bytes} = process_info(actor_file:start(),memory).
2> {memory,2720}

Erlang进程

Erlang使用抢先式调度程序。抢占式调度程序通过运行任务,抢占,然后根据特定指标(例如优先级,时间或减少)恢复它们来工作。

Erlang的抢先式调度程序使用减少计数。减少通常是函数调用,垃圾收集,消息发送等.Erlang进程的减少计数是2000,这可以非常快。

此外,进程可以并且可以标记优先级:’max’,’high’,’normal’和’low’。

调度程序使Erlang成为低延迟,并行化程序的绝佳选择,因为它可以有效地管理多任务,因为它不允许任何一个进程独占资源。