Erlang多处理消息接收和发送

Erlang多处理消息接收和发送,erlang,multiprocessing,message,Erlang,Multiprocessing,Message,我正在学习“向您学习一些Erlang”一书。我有几个问题要用Erlang实现多处理编程。基本上,我是在读和模仿“学点二郎”。我已经生成了一个程序,程序中有一些定向函数。它说,冰箱可以像自己一样储存和携带。因此,我正在处理我的程序,以便在一个基地内执行以下操作: 首先,我需要终止消息应该与store and take对应的表单相同。这意味着消息应该是{from,terminate},接收者回复消息{self(),terminated} 第二,我想用消息{self(),{not_recognize

我正在学习“向您学习一些Erlang”一书。我有几个问题要用Erlang实现多处理编程。基本上,我是在读和模仿“学点二郎”。我已经生成了一个程序,程序中有一些定向函数。它说,冰箱可以像自己一样储存和携带。因此,我正在处理我的程序,以便在一个基地内执行以下操作:

  • 首先,我需要终止消息应该与store and take对应的表单相同。这意味着消息应该是
    {from,terminate}
    ,接收者回复消息
    {self(),terminated}

  • 第二,我想用消息
    {self(),{not_recognized,Msg}}
    响应发送者一个无组织的消息
    {From,Msg}

  • 第三,要添加库存消息,{code>{From,{inventory}}将返回fridge2进程中当前的
    食品列表

  • 第四,要添加一条peek消息,{code>{From,{peek,a}}将查找流程中存储的项目。如果存在,则将邮件发回发件人(发件人):
    {present,a}
    。如果a是 不存在,将消息发送回发件人(发件人):
    {not_present,a}

我完全搞不懂冰箱本身的用途。我通过教程中的示例代码得出了如下结论:

-module(kitchen).
-compile(export_all).

fridge1() ->
receive
    {From, {store, _Food}} ->
        From ! {self(), ok},
        fridge1();
    {From, {take, _Food}} ->
        %% uh ...
        From ! {self(), not_found},
        fridge1();
    terminate             ->
            ok
end.

fridge2(FoodList) ->                        
receive
    {From, {store, Food}} ->
        From ! {self(), ok},
        fridge2( [Food | FoodList] );       
    {From, {take, Food}} ->
        case lists:member(Food, FoodList) of
            true   ->
                From ! {self(), {ok, Food}},
                fridge2(lists:delete(Food, FoodList));      
            false  ->
                From ! { self(), not_found},                    
                fridge2(FoodList)                           
            end;
    terminate            ->
        ok
end. 

store(Pid, Food) ->
Pid ! {self(), {store, Food}},
receive
    {Pid, Msg} -> Msg
end.

take(Pid, Food) ->
Pid ! {self(), {take, Food}},
receive 
    {Pid, Msg} -> Msg
end.

start(FoodList) ->
spawn(?MODULE, fridge2, [FoodList]).
此外,我一直在想一些问题:

  • 如何创建冰箱流程?或者它已经在那里了

  • 我如何创建烹饪过程,并将其传递给冰箱过程pid

  • 我怎样才能把物品储存在冰箱里,然后睡上几秒钟,最后从冰箱里拿出一件物品


  • 这可能不是最复杂的问题,但我找不到任何有关此问题的文档,因此我希望你们中的一些人知道答案。

    回答您的问题:

  • 如何创建冰箱流程?或者它已经在那里了
  • 从erlang shell或其他模块调用
    kitchen:start/1
    后,函数
    spawn(?module,fridge2,[FoodList])
    将为您生成一个进程。有关更多详细信息,请参阅文档:

  • 我如何创建烹饪过程,并将其传递给冰箱过程pid
  • 正如我在第一个答案中所说,
    spawn/3
    ,它将
    模块
    函数
    参数
    作为参数,是可以用来生成新进程的函数之一。因此,您应该使用它来生成一个进程,该进程接收
    kitchen:fridge2/1
    pid作为参数,比如

    Kitchen = kitchen:start([]),
    Cook = spawn(cook_module, cook_function, [Kitchen]).
    
    这样,您将生成一个进程,该进程执行
    cook\u模块:cook\u function/1
    ,并将
    Kitchen
    (冰箱pid)作为参数传递

  • 我怎样才能把物品储存在冰箱里,然后睡上几秒钟,最后从冰箱里拿出一件物品
  • 您可以使用
    store/2
    功能将物品储存到冰箱中,稍等片刻(或几秒钟,如您所愿),然后使用
    take/2
    功能从冰箱中取出物品。就这样,

    Pid = kitchen:start([]), %% this will spawn a fridge process
    kitchen:store(Pid, "delicious insect pie"), %% this will store a delicious insect pie in your fridge by executing the function fridge2( [Food | FoodList] );
    timer:sleep(1000), %% this function will make the caller process sleeps for 1000 milliseconds (you can change it for your several seconds instead...)
    kitchen:take(Pid, "delicious insect pie"). %% this will take the delicious insect pie out of the fridge, by executing the function fridge2(lists:delete(Food, FoodList));