【发布时间】:2016-03-19 10:39:52
【问题描述】:
我正在学习“Learn you some Erlang”一书。我有几个问题要解决关于使用 Erlang 进行多处理编程的问题。基本上,我正在阅读和模仿“Learn you some Erlang”。我已经在我的程序中生成了一个带有一些面向函数的程序。它说冰箱可以像它自己一样储存和取用。因此,我正在处理我的程序以执行以下基本操作:
首先,我需要终止消息应该对应于与存储和获取相同的形式。这意味着消息应该是
{from, terminate},并且接收者回复消息{self(), terminated}。其次,我想用消息
{self(), {not_recognized, Msg}}回复发件人一个无组织的消息{From, Msg}。第三,添加库存消息
{From, {inventory} }将在冰箱2进程中将当前FoodList返回给发件人(From)。四、添加peek消息
{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]).
此外,还有一些我一直在思考的问题:
如何创建冰箱进程?还是已经存在了?
我如何创建一个厨师进程,将冰箱进程 pid 传递给它?
如何将物品存放在冰箱中,然后休眠几秒钟,最终我可以从冰箱中取出物品?
这可能不是最复杂的问题,但我找不到任何关于此的文档,所以我希望你们中的一些人知道答案。
【问题讨论】:
标签: erlang multiprocessing message