Erlang-实现进程环

M是消息传递数目,N进程数量,Msg是传递的消息

-module(exe3_2).
-export([start/3,stop/0]).

start(M,N,Msg) ->register(ring,spawn(fun()->ring_service(M,N,Msg) end)).

stop() -> ring!stop.

ring_service(M,N,Msg) ->
    Ring=ring_node(N,[]),%Ring是进程环
    send_msg(M,Msg,Ring),
    receive
        stop -> stop_ring(Ring)
    end.

stop_ring([]) ->ok;
stop_ring([H|T]) ->H!stop,
                 stop_ring(T).



send_msg(0,_Msg,_Ring) ->ok;
send_msg(M,Msg,[H|T]) ->H ! {msg,M,Msg},
                        send_msg(M-1,Msg,T ++ [H]).



ring_node(N,Ring) when N>0 
                    ->Next_Pid = spawn(fun() ->loop() end),
                    ring_node(N-1,[Next_Pid|Ring]);
ring_node(0,Ring) ->lists:reverse(Ring).

loop() ->
        receive
            {msg,M,Msg} ->
                io:format("~w:~w:~w~n",[self(),M,Msg]),
                loop();
            stop ->true
        end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值