1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

複数のプロセスによる処理

Posted at

以下の書籍に載っているサンプルを実装します。
すごいErlangゆかいに学ぼう!

Erlangにて、マルチプロセスで動くような機能を利用します。
機能概要は以下のような形とします。
「冷蔵庫の中身を管理するアプリ」
・CLI(erlシェル)で実装する
・冷蔵庫に食材(?)追加する機能
・冷蔵庫から食材を出す機能
・可能な限り抽象化する

プログラム

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

fridge (FoodList) ->
  receive
    {From, {store, Food}} ->
      From ! {self (), ok},
      fridge ([Food| FoodList]);
    {From, {take, Food}} ->
      case lists:member (Food, FoodList) of
        true ->
          From ! {self (), {ok, Food}},
          fridge (lists:delete (Food, FoodList));
        false ->
          From ! {self (), not_found},
          fridge (FoodList)
        end;
    terminate ->
      ok
  end
.
store (Pid, Food) ->
  Pid ! {self (), {store, Food}},
  receive
    {Pid, Msg} -> Msg
  after 3000 ->
    timeout
  end
.
take (Pid, Food) ->
  Pid ! {self (), {take, Food}},
  receive
    {Pid, Msg} -> Msg
  after 3000 ->
    timeout
  end
.
start () ->
  FoodList = [milk, chicken, bread],
  spawn(?MODULE, fridge, [FoodList])
.

実行

kitchen_exe
1> c(kitchen).
{ok,kitchen}
2> Pid = kitchen:start().
<0.41.0>
3> kitchen:take(Pid, milk).
{ok,milk}
4> kitchen:take(Pid, milk).
not_found
5> kitchen:store(Pid, tea). 
ok
6> kitchen:take(Pid, tea). 
{ok,tea}

少しずつErlangの機能が見えてきました。プロセス生成、メッセージパッシング、プロセスライフサイクル、プロセスモニタ、プロセスリンクなど並列、分散処理を実現する上で、考慮しなければならないことが機能やデザインパターンでまとまっていて、凄く勉強になります。

冒頭で挙げた書籍は、Erlangの技術知識もそうですが、関数系言語の説明、複雑なプログラムの抽象化など、たくさんの知識が得られてすばらしい内容ですね(ちょっと古いですが。。)

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?