Erlang-并发

来源:互联网 发布:剑三正太捏脸数据图片 编辑:程序博客网 时间:2024/05/17 02:00

 

创建新进程:spawn

语法:spawn(Module, Exported_Function, List ofArguments).

举例:spawn(tut14, say_something, [hello, 3]),

 

发消息:Pid ! Message

举例:Ping_PID ! pong表示向Ping_PID进程发送元组pong (!操作符用于发消息)

 

self():self() returns the pid of the process which executes self()

 

接收消息:receive ....end

语法:

receive
   pattern1 ->
       actions1;
   pattern2 ->
       actions2;
   ....
   patternN
       actionsN
end.

 

接收超时:after

语法:after time

举例:after 5000(见tut19)

pong() ->
    receive
        {ping, Ping_PID} ->
            io:format("Pong received ping~n", []),
            Ping_PID ! pong,
            pong()
    after 5000 ->
            io:format("Pong timed out~n", [])
    end.

下面两个特殊的超时time:

1)infinity(无穷大),infinity是一个atom,指定了超时设置将永远不会被执行。
2) 0,超时如果设定为0意味着超时设置将立刻执行,但是系统将首先尝试当前“邮箱”里的消息。
 

-module(tut14).

-export([start/0, say_something/2]).
say_something(What, 0) ->
    done;
say_something(What, Times) ->
    io:format("~p~n", [What]),
    say_something(What, Times - 1).
start() ->
    spawn(tut14, say_something, [hello, 3]),
    spawn(tut14, say_something, [goodbye, 3]).

 

-module(tut15).
-export([start/0, ping/2, pong/0]).
ping(0, Pong_PID) ->
    Pong_PID ! finished,
    io:format("ping finished~n", []);
ping(N, Pong_PID) ->
    Pong_PID ! {ping, self()},
    receive
        pong ->
            io:format("Ping received pong~n", [])
    end,
    ping(N - 1, Pong_PID).
pong() ->
    receive
        finished ->
            io:format("Pong finished~n", []);
        {ping, Ping_PID} ->
            io:format("Pong received ping~n", []),
            Ping_PID ! pong,
            pong()
    end.
start() ->
    Pong_PID = spawn(tut15, pong, []),
    spawn(tut15, ping, [3, Pong_PID]).

 

-module(tut19).
-export([start_ping/1, start_pong/0,  ping/2, pong/0]).
ping(0, Pong_Node) ->
    io:format("ping finished~n", []);
ping(N, Pong_Node) ->
    {pong, Pong_Node} ! {ping, self()},
    receive
        pong ->
            io:format("Ping received pong~n", [])
    end,
    ping(N - 1, Pong_Node).
pong() ->
    receive
        {ping, Ping_PID} ->
            io:format("Pong received ping~n", []),
            Ping_PID ! pong,
            pong()
    after 5000 ->
            io:format("Pong timed out~n", [])
    end.
start_pong() ->
    register(pong, spawn(tut19, pong, [])).
start_ping(Pong_Node) ->
    spawn(tut19, ping, [3, Pong_Node]).

原创粉丝点击