并发编程

Erlang及其并发模型设计哲学:

  • 世界是并发的
  • 事物之间不共享数据
  • 事物通过消息进行通信
  • 事物会出现故障

创建进程

内置函数spawn(Module, Function, Arguments)可以生成一个新进程

Erlang 的进程是轻量级的,不等同与系统的进程或线程

生成一个进程永远不会失败,即使使用了一个没有导出的或者不存在的函数

内置函数processes()返回所有系统中运行的进程列表。

终端命令i()来查看当前运行时系统正在执行的进程。

消息传递

进程使用消息传递进行相互通信。消息使用Pid ! Message构造来发送

每个Erlang进程都有用来存储传入消息的信箱(mailbox)

发送消息永远不会失败,发送消息给一个不存在的进程,消息会被丢弃

消息传递时异步的

接受消息

消息可以使用receive语句从进程信箱中取得。

Examples:

receive
    {reset, Board} -> reset(Board);
    _Other -> {error, unknown_msg}
after
    1000  -. {error, timeout}
end

最好一个进程消息处理速度大于这个进程接受到的消息速度

注册进程

内置函数 register(Alias, Pid)来注册进程别名

一旦注册可一个进程,任何进程都可以将消息发送给它,而不需要知道它的标识符。

Examples:

register(echo, spawn(echo, loop, [])).
echo ! {self(), hello}

内置函数 regs() 会列出所有已注册了别名的进程

内置函数 whereis/1 会返回指定进程别名的Pid,如果不存在该进程时返回undefined

垃圾收集器不会收集基元是Erlang的一个内存管理特性,所以如果不断使用list_to_atom来决定别名,并且会建立对应已注册进程,可能会耗尽内存

最好只注册生命周期长的进程,必须将字符串转换为别名时,请使用ist_to_existing_atom/1

发送一个消息到不存在的注册进程会导致badarg错误,从而使调用进程终止

进程管理器

终端输入pman:start()可以启动进程管理器。