并发编程
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()可以启动进程管理器。