备注:Erlang-- 学习笔计,知识要点来自于维基百科,一些不容易懂的地方,我给出重新解释,方便自己理解和记忆,如果有错误,请大家不吝指教。
平行式程序设计
Erlang最主要的特色是 面向并发程序设计 ,强调多程序平行运作,并且以信息对彼此沟通。Erlang提供了 spawn 函数和 ! 、 receive ... end 等关键字,可以描述在Erlang/开源电信平台中的如何启动一些程序、并且如何让程序传递信息。此外, 面向并发程序设计 的精神还强调程序的容错处理,借由程序发生错误时的信息传递,使其他程序可以得知错误的发生,使方便于后续处理。以下分别介绍面向并发程序设计的一般程序撰写方式,以及错误处理的使用方式面向并发程序设计
基本的平行程序示范如下:- 以下启动一个程序
% create process and call the function web:start_server(Port, MaxConnections) ServerProcess = spawn(web, start_server, [Port, MaxConnections]),
- 以下是在任何程序中,对先前起动的程序送一则信息 {pause, 10}
% send the {pause, 10} message (a tuple with an atom "pause" and a number "10") % to ServerProcess (asynchronously) ServerProcess ! {pause, 10},
- 以下是一段接收信息的程序。每个程序都拥有一份邮箱,可伫留收到的信息; 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: ..." 。
- 以下程序,示范产生一组环状传递信息的程序
% 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訊息;接收到其他任何訊息,就對下一個程序送同樣的訊息。
- 如果传送任何其他信息,就会让所有的程序不断对下一个程序传递信息。而以下是测试传送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> >