首页 > 代码库 > Erlang--并发编程
Erlang--并发编程
(一)并发编程:
1、Erlang的进程的特点:
1、创建和销毁进程是非常讯速
2、在进程间发送消息是非常讯速
3、进程在所有操作系统上都具有相同的行为方式
4、可以拥有大量进程
5、进程不共享任何内存,是完全独立的
6、进程唯一的交互方式就是消息传递
2、创建进程:
1、spawn(Mod, Fun, Args)
2、spawn_link(Mod, Fun, Args)
1、Mod: 模块名
2、Fun: 函数名
3、Args: 参数列表
3、进程间通信:
1、发送消息: Pid ! Msg
2、接受消息:
receive Pattern1 [when Guard1] -> Expression1; Pattern2 [when Guard2] -> Expression2; ... after WaitTime -> % WaitTime为超时时间 ExpressionXX % ExpressionXX后不能有什么符号 end
4、注册进程: Pid来惟一表示一个进程,注册进程,可以给Pid取一个别名,然后用这个别名来代表Pid,从而向一个进程发送消息:
1、register(Atom, Pid), 给一个Pid注册一个名字
2、unregister(Atom), 取消注册
3、whereis(Atom), 查询一个名字所代表的Pid
4、registered() , 获取所有已经注册了的进程的名字,返回一个列表
5、进程间的关系:
1、基本概念:
1、系统进程: 一种能接受和处理错误信号的进程
2、普通进程: 通过spawn或者spawn创建的进程,调用process_flag(trap_exit, true), 转成系统进程
3、连接 : 双向,如果A和B相连,而A进程因某些原因终止,就会向B发送一个错误信号,反之亦然
4、监视 : 单向, A监视B, B因某些原因终止,就会向B发送一个消息,而B不会向A发送关闭消息
5、退出信号 :
1、{‘EXIT‘, Pid, Why}, 普通进程接受到这个消息,Why如果非normal,就退出,而系统进程不会
2、exit(Why), 关闭当前进程, 这个操作也会转换成上面(1)的消息,会向相关进程发送关闭消息
3、exit(Pid, kill), 强制关闭某一个进程,但是不会产生(1)的消息
2、连接:
1、创建连接:
1、spawn_link(Mod, Fun, Args), 分裂一个进程,并与本进程相关联
2、link(Pid), 与一个Pid相连
2、取消连接:
1、unlink(Pid), 取消本进程与Pid的关联
3、监视:
1、创建监视:
1、spawn_monitor(Mod, Func, Args) -> {Pid, Ref}, 类似于spawn_link,但是创建的是监
视, 当被监视的进程关闭时,会向监视进程发送{‘DOWN‘, Ref, process, Pid, Why}:
1、Pid, 创建的进程ID
2、Ref, 一个引用,不同与C++中的引用,仅仅表示是一个惟一变量,相当于一个口令
2、取消监视:
1、demonitor(Ref) -> true, 移除对Ref作为引用的进程的监视
6、例子:
calc_server.erl
-module(calc_server). -export([loop/0, rpc/2]). rpc(Pid, Request) -> Pid ! {self(), Request}, receive Response -> Response end. loop() -> receive {From, {rectangle, Width, Height}} -> From ! Width * Height, loop(); {From, {circle, R}} -> From ! 3.1415*R*R, loop(); {From, Other} -> From ! {error, Other}, loop() end.
运行步骤:
1、编译calc_server.erl
2、在erlang shell中输入: Pid = spawn(calc_server, loop, []).
3、在erlang shell中输入: calc_server:rpc(Pid, {rectangle, 6, 8}).
4、在erlang shell中输入: calc_server:rpc(Pid, {circle, 6}).
5、在erlang shell中输入: calc_server:rpc(Pid, xxxyyyy) .
7、进程的错误处理机制:
1、让其他进程修复错误
2、任其崩溃
Erlang--并发编程