Erlang多处理消息接收和发送
我正在学习“向您学习一些Erlang”一书。我有几个问题要用Erlang实现多处理编程。基本上,我是在读和模仿“学点二郎”。我已经生成了一个程序,程序中有一些定向函数。它说,冰箱可以像自己一样储存和携带。因此,我正在处理我的程序,以便在一个基地内执行以下操作:Erlang多处理消息接收和发送,erlang,multiprocessing,message,Erlang,Multiprocessing,Message,我正在学习“向您学习一些Erlang”一书。我有几个问题要用Erlang实现多处理编程。基本上,我是在读和模仿“学点二郎”。我已经生成了一个程序,程序中有一些定向函数。它说,冰箱可以像自己一样储存和携带。因此,我正在处理我的程序,以便在一个基地内执行以下操作: 首先,我需要终止消息应该与store and take对应的表单相同。这意味着消息应该是{from,terminate},接收者回复消息{self(),terminated} 第二,我想用消息{self(),{not_recognize
- 首先,我需要终止消息应该与store and take对应的表单相同。这意味着消息应该是
,接收者回复消息{from,terminate}
{self(),terminated}
- 第二,我想用消息
响应发送者一个无组织的消息{self(),{not_recognized,Msg}}
{From,Msg}
- 第三,要添加库存消息,{code>{From,{inventory}}将返回fridge2进程中当前的
食品列表
- 第四,要添加一条peek消息,{code>{From,{peek,a}}将查找流程中存储的项目。如果存在,则将邮件发回发件人(发件人):
。如果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]).
此外,我一直在想一些问题:
这可能不是最复杂的问题,但我找不到任何有关此问题的文档,因此我希望你们中的一些人知道答案。回答您的问题:
kitchen:start/1
后,函数spawn(?module,fridge2,[FoodList])
将为您生成一个进程。有关更多详细信息,请参阅文档:
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));