Erlang多处理消息的接收和发送

时间:2015-12-14 02:07:33

标签: erlang multiprocessing message

我正在学习这本书"了解一些Erlang"。我在使用Erlang进行多处理编程时有几个问题要实现。基本上,我正在阅读和模仿"了解一些Erlang"。我在程序中生成了一个带有一些导向函数的程序。它说冰箱可以像自己一样存放和拿走。因此,我在基本遵循以下的一些操作中处理我的程序:

  • 首先,我需要终止消息应该与store和take相同的形式。这意味着该消息应为{from, terminate},并且接收方回复消息{self(), terminated}

  • 其次,我想回复发件人一条无组织的邮件{From, Msg},邮件为{self(), {not_recognized, Msg}}

  • 第三,添加广告资源消息{From, {inventory} }将返回发件人(发件人)ice2进程中的当前FoodList

  • 第四,添加查看消息{From, {peek, a} }将查看存储在流程中的项目。如果存在,请将消息发送回发件人(发件人):{present, 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]).

此外,这里有一些我一直在思考的问题:

  1. 我怎样才能创建冰箱流程?或者它已经存在了?

  2. 我怎样才能创建一个烹饪过程,将冰箱过程pid传递给它?

  3. 我如何将物品存放在冰箱中,然后睡几秒钟,最后我可以从冰箱里取出物品?

  4. 这可能不是最复杂的问题,但我找不到任何关于此的文档,所以我很感激你们中的一些人可能知道答案。

1 个答案:

答案 0 :(得分:5)

回答你的问题:

  
      
  1. 我怎样才能创建冰箱流程?或者它已经存在了?
  2.   

从erlang shell或其他模块调用kitchen:start/1后,函数spawn(?MODULE, fridge2, [FoodList])将为您生成一个进程。请查看文档以获取更多详细信息:http://www.erlang.org/doc/man/erlang.html#spawn-3

  
      
  1. 我怎样才能创建一个烹饪过程,将冰箱过程pid传递给它?
  2.   

正如我在第一个回答中所说,spawn/3,其中modulefunctionarguments作为参数,是您可以使用的功能之一产生新的过程。因此,您应该使用它来生成一个接收kitchen:fridge2/1 pid作为参数的进程,类似于

Kitchen = kitchen:start([]),
Cook = spawn(cook_module, cook_function, [Kitchen]).

这样你就会产生一个执行cook_module:cook_function/1并传递Kitchen(冰箱pid)作为参数的进程。

  
      
  1. 我如何将物品存放在冰箱中,然后睡几秒钟,最后我可以从冰箱里拿出一件物品?
  2.   

您可以使用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));