Process 与进程相关的Erlang环控制器

Process 与进程相关的Erlang环控制器,process,erlang,Process,Erlang,我是新来Erlang的,我有以下作业要解决: “控制”过程必须提供一个用户函数go(N,M),该函数 生成{1,2,…,M}中M个随机整数的列表L, 设置由N个进程组成的环(所谓的“工作进程”)并发送令牌 给第一个工人。当worker k接收到令牌时,它发送一个 消息{eat,self()}来控制并将令牌发送给下一个工作者 当控件收到消息{eat,Pid}时,它提取列表的头H L并将元组{H,Pid}附加到结果列表。当列表L为空时,控制 向环发送停止消息,终止工人并打印结果 名单 任何帮助都是值

我是新来Erlang的,我有以下作业要解决:

“控制”过程必须提供一个用户函数go(N,M),该函数 生成{1,2,…,M}中M个随机整数的列表L, 设置由N个进程组成的环(所谓的“工作进程”)并发送令牌 给第一个工人。当worker k接收到令牌时,它发送一个 消息{eat,self()}来控制并将令牌发送给下一个工作者

当控件收到消息{eat,Pid}时,它提取列表的头H L并将元组{H,Pid}附加到结果列表。当列表L为空时,控制 向环发送停止消息,终止工人并打印结果 名单


任何帮助都是值得的

实际上有两种方法可以解决这个问题。
第一个是: 控件
生成环中的所有工人,以下是解决方案:

-module(ring). 
-export([start/3, create/4]). 

start(M, N, Message) -> 
        create(undef, N, M, Message). 

create(Parent, 0, M, Message) -> 
        Parent ! {created, self()}, 
        evaluate(Parent, M, Message); 

create(Parent, N, M, Message) -> 
        Child = spawn(?MODULE, create, [self(), N-1, M, Message]), 
        io:format("~w ~w created~n", [Child, N]), 
        evaluate(Parent, M, Message). 

evaluate(undef, M, Message) -> 
        receive 
                {created, Last} -> 
                        Last ! Message, 
                        io:format("~w sent ~w to ~w~n", [self(), Message, Last]), 
                        evaluate(Last, M-1, Message) 
        end; 

evaluate(Parent, 0, _) -> 
        receive 
                Msg -> 
                        io:format("~w received ~w~n", [self(), Msg]), 
                        Parent ! stop, 
                        io:format("~w sent ~w to ~w~n", [self(), stop, Parent]) 
        end; 

evaluate(Parent, M, Message) -> 
        receive 
                {created, Last} -> 
                        Parent ! {created, Last}, 
                        evaluate(Parent, M, Message); 
                Message -> 
                        io:format("~w received ~w~n", [self(), Message]), 
                        Parent ! Message, 
                        io:format("~w sent ~w to ~w~n", [self(), Message, Parent]), 
                        evaluate(Parent, M-1, Message) 
        end. 
第二个是:control
只生成环中的第一个worker。每个新工人
在环中,但在最后一个环中,会生成下一个工人:

-module(ring). 
-export([start/3, start_process/1, start_process/2]). 

start(M, N, Message) -> 
    Pid = spawn(ring, start_process, [N]), 
    Pid ! {message, Message, M}, 
    ok. 

start_process(Count) -> 
    % This is the first spawned process - send its 
    % pid down the chain so the last process knows who its 
    % next pid is. 
    io:format("~p: Spawned ~p~n", [self(), Count]), 
    Pid = spawn(ring, start_process, [Count-1, self()]), 
    loop(Pid). 

start_process(0, Last) -> 
    % This is the last process 
    io:format("~p: Linking to last ~p~n", [self(), Last]), 
    loop(Last); 
start_process(Count, Last) -> 
    io:format("~p: Spawned ~p~n", [self(), Count]), 
    Pid = spawn(ring, start_process, [Count-1, Last]), 
    loop(Pid). 

loop(NextPid) -> 
    receive 
        {message, _,   0} -> true; 
        {message, Msg, M} -> 
            io:format("~p (~p) ~p~n", [Msg, self(), M]), 
            NextPid ! {message, Msg, M-1}, 
            loop(NextPid) 
    end. 

实际上有两种方法可以解决这个问题。
第一个是: 控件
生成环中的所有工人,以下是解决方案:

-module(ring). 
-export([start/3, create/4]). 

start(M, N, Message) -> 
        create(undef, N, M, Message). 

create(Parent, 0, M, Message) -> 
        Parent ! {created, self()}, 
        evaluate(Parent, M, Message); 

create(Parent, N, M, Message) -> 
        Child = spawn(?MODULE, create, [self(), N-1, M, Message]), 
        io:format("~w ~w created~n", [Child, N]), 
        evaluate(Parent, M, Message). 

evaluate(undef, M, Message) -> 
        receive 
                {created, Last} -> 
                        Last ! Message, 
                        io:format("~w sent ~w to ~w~n", [self(), Message, Last]), 
                        evaluate(Last, M-1, Message) 
        end; 

evaluate(Parent, 0, _) -> 
        receive 
                Msg -> 
                        io:format("~w received ~w~n", [self(), Msg]), 
                        Parent ! stop, 
                        io:format("~w sent ~w to ~w~n", [self(), stop, Parent]) 
        end; 

evaluate(Parent, M, Message) -> 
        receive 
                {created, Last} -> 
                        Parent ! {created, Last}, 
                        evaluate(Parent, M, Message); 
                Message -> 
                        io:format("~w received ~w~n", [self(), Message]), 
                        Parent ! Message, 
                        io:format("~w sent ~w to ~w~n", [self(), Message, Parent]), 
                        evaluate(Parent, M-1, Message) 
        end. 
第二个是:control
只生成环中的第一个worker。每个新工人
在环中,但在最后一个环中,会生成下一个工人:

-module(ring). 
-export([start/3, start_process/1, start_process/2]). 

start(M, N, Message) -> 
    Pid = spawn(ring, start_process, [N]), 
    Pid ! {message, Message, M}, 
    ok. 

start_process(Count) -> 
    % This is the first spawned process - send its 
    % pid down the chain so the last process knows who its 
    % next pid is. 
    io:format("~p: Spawned ~p~n", [self(), Count]), 
    Pid = spawn(ring, start_process, [Count-1, self()]), 
    loop(Pid). 

start_process(0, Last) -> 
    % This is the last process 
    io:format("~p: Linking to last ~p~n", [self(), Last]), 
    loop(Last); 
start_process(Count, Last) -> 
    io:format("~p: Spawned ~p~n", [self(), Count]), 
    Pid = spawn(ring, start_process, [Count-1, Last]), 
    loop(Pid). 

loop(NextPid) -> 
    receive 
        {message, _,   0} -> true; 
        {message, Msg, M} -> 
            io:format("~p (~p) ~p~n", [Msg, self(), M]), 
            NextPid ! {message, Msg, M-1}, 
            loop(NextPid) 
    end.