乐趣区

erlang学习记录(二)进程

erlang 进程
erlang 进程与操作系统进程不同,erlang 进程的切换、生成和消息传递是由 erlang 虚拟机管理的。是 erlang 并发单元的一个代称。每个进程代表一个持续的活动,执行某一段代码。在执行完毕后自动退出。
创建、链接进程
erlang 进程的创建由 spawn() 函数完成,spawn() 常用的有以下两种形式。

spawn(Fun()).
spawn(Module,Function,ListOfArgs).
spawn_link(Fun()).
spawn_link(Module,Funtion,ListOfArgs).

第二种方法要求给定的函数必须事先从模块中导出,并且初始数据只能由参数列表传入。同时,第二种方法总是采用模块的最新版本。这些函数均返回新进程的 Pid。spawn_link(…) 将创建的进程与原进程链接起来,确保这两个操作为原子操作。
如果两个进程互相连接,则一个进程终止时会像另一个进程发错误信号 {‘EXIT’,Pid,Reason}。创建链接的函数为 link(Pid),它将当前进程与 Pid 链接起来。
监视进程
链接的替代品。一种单向链接。由一下几种函数完成

spawn_monitor(Fun()).
spwan_monitor(Module,Function,ListOfArgs).

被监视的进程退出会发消息给监视进程,监视进程退出则对被监视进程无影响。
退出进程
1、抛出异常终结进程。
exit(Reason)
除非被进程捕获,否则该调用将令进程停止,并将 Reason 作为退出信号的一部分发送给所有与该进程相链接的进程。
2、直接向进程发送退出信号
exit(Pid,Reason)
该信号终止的是接收方。发送该信号时,收发双方无需链接。如果 Reason 是原子 kill,则接受方无法捕捉该信号,会被强制终止。
3、设置 trap_exit 标志
process_flag(trap_exit,true)
默认情况下,进程收到链接的其他进程的退出信号就会退出。设置 trap_exit 标志可以避免这种情况。设置该标志后,除了无法捕捉的信号外,其他的外来退出信息都会被转换成无害的消息。
进程间消息的传递
receive
Pattern1 when Guard1 ->
%% do some thing
Pattern2 when Guard2 ->
%% do some thing
after Time ->
%% do some thing
end
上面代码中的关卡是为了提取部分信息,如果省略则会接受所有消息。after 段也是可选的,如果省略,receive 永不超时。否则 Time 必须是表示毫秒数的整数或原子 infinity。如果 Time 为 0。则 receive 永不阻塞,如果为 infinity,则 receive 永不超时。
注册进程
register(name,Pid)
用于给进程绑定一个名字。方便对进程的操作。
消息投递与信号
进程间信息传递除了用消息投递符 ! 以外还有进程发出的退出信号和尝试链接两个进程时的链接请求。
传递消息时,以下基本传递保障时对所有信号成立的

如果进程 A 向进程 B 先后发送了 S1 和 S2。无论信号间隔由多久,这两个信号都将按照发送顺序到达。
尽力投递所有信号。

进程字典
进程自身状态的一部分,每个进程都有一个私有的进程字典。这是一个可以用任何值作为键的简单哈希表,用于存储 Erlang 项。
通过内置函数 put(key,value) 和 get(key,value) 可以从中存取项。
尽量使用 Ets 表。不要使用进程字典。
erlang fun 函数
erlang 将函数视为数据。将函数封装成数据的对象称为 fun 函数 (C++ 中的 lamada 表达式或者闭包)
函数有命名函数和匿名函数
命名函数可以直接通过函数名调用,也可以用来给其他函数当参数。
匿名函数的形式为 fun()-> end. 匿名函数必须与变量绑定,或者作为参数传递给其他函数,或者作为函数返回值。

退出移动版