首页 > 代码库 > 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--并发编程