Erlang-- 学习笔记5,平行式、面向并发程序设计

备注:Erlang-- 学习笔计,知识要点来自于维基百科,一些不容易懂的地方,我给出重新解释,方便自己理解和记忆,如果有错误,请大家不吝指教。

平行式程序设计 

     Erlang最主要的特色是 面向并发程序设计 ,强调多程序平行运作,并且以信息对彼此沟通。Erlang提供了 spawn 函数和  !  、  receive  ...  end  等关键字,可以描述在Erlang/开源电信平台中的如何启动一些程序、并且如何让程序传递信息。此外, 面向并发程序设计 的精神还强调程序的容错处理,借由程序发生错误时的信息传递,使其他程序可以得知错误的发生,使方便于后续处理。以下分别介绍面向并发程序设计的一般程序撰写方式,以及错误处理的使用方式

面向并发程序设计 

基本的平行程序示范如下:
  1. 以下启动一个程序
    % create process and call the function web:start_server(Port, MaxConnections)
    ServerProcess = spawn(web, start_server, [Port, MaxConnections]),

  2. 以下是在任何程序中,对先前起动的程序送一则信息 {pause10
    % send the {pause, 10} message (a tuple with an atom "pause" and a number "10")
    % to ServerProcess (asynchronously)
    ServerProcess ! {pause, 10},

  3. 以下是一段接收信息的程序。每个程序都拥有一份邮箱,可伫留收到的信息; receive ... end 程序片断是从程序的邮箱中取出最早伫留的信息
    % receive messages sent to this process
    receive       
            a_message -> do_something; 
            {data, DataContent} -> handle(DataContent);
            {hello, Text} -> io:format("Got hello message: ~s", [Text]);
            {goodbye, Text} -> io:format("Got goodbye message: ~s", [Text])
    end.
    
    收到 a_message 結果就是 do_something ;收到 {data, DataContent} 結果會呼叫 handle(DataContent) ;
    收到 {hello, Text} 結果教是印出 "Got hello message: ..." ,收到 {goodbye, Text} 結果是印出
    "Got goodbye message: ..." 。

  4. 以下程序,示范产生一组环状传递信息的程序
    % receive messages sent to this process
    receive       
            a_message -> do_something; 
            {data, DataContent} -> handle(DataContent);
            {hello, Text} -> io:format("Got hello message: ~s", [Text]);
            {goodbye, Text} -> io:format("Got goodbye message: ~s", [Text])
    end.
    
    收到 a_message 結果就是 do_something ;收到 {data, DataContent} 結果會呼叫 handle(DataContent) ;
    收到 {hello, Text} 結果教是印出 "Got hello message: ..." ,收到 {goodbye, Text} 結果是印出
    "Got goodbye message: ..." 。
    以下程序,示范产生一组环状传递信息的程序。
    ring_proc(Funs) ->
        Ns = lists:seq(1, length(Funs)),
        [P|Pids] = [ spawn(?MODULE, lists:nth(Nth,Funs),[]) || Nth <- Ns ],
        [ Pid ! ToPid || {Pid, ToPid} <- lists:zip([P|Pids], Pids++[P]) ]. 
    
    func() ->
        receive
            ToPid ->
                func_msg_(ToPid)
        end.
    
    func_msg_(ToPid) ->
        receive
            stop ->
                io:format("Stop process ~w~n", [self()]),
                ToPid ! stop;
            Message ->
                io:format("~w: transmit message to ~w~n", [self(), ToPid]),
                ToPid ! Message,
                func_msg_(ToPid)
        end.
    
    接收stop訊息,就對下一個程序送stop訊息;接收到其他任何訊息,就對下一個程序送同樣的訊息。

  5. 如果传送任何其他信息,就会让所有的程序不断对下一个程序传递信息。而以下是测试传送stop信息的运行结果
    > [P|_] = example:ring_proc([func,func,func]).
    [<0.233.0>,<0.234.0>,<0.232.0>]
    > P ! stop.
    Stop process <0.233.0>
    stop
    Stop process <0.234.0>
    > Stop process <0.232.0>
    >

你可能感兴趣的:(Erlang)