Subscribed unsubscribe Subscribe Subscribe

Eralng Course: Module 3 - Concurrent Programming 前編

もくじ

定義(Definitions)

  * プロセス Process - 並列動作。完全な仮想マシン

                システムはたくさんの並列プロセスを

                同時に実行することがある。

  * メッセージ Message - プロセス間通信手段

  * タイムアウト Timeout - あたえられた時間の間、待機するしくみ。

  * 登録プロセス Registered Process - 名前で登録されたプロセス

  * クラ/サバ モデル Client/Server Model - 並列実行の基本モデル

プロセスの生成(Creating a New Process)

  以下の命令でプロセスが生成される。Pid2はプロセスの

  識別子(Pid = Process id)を保持する変数。

    Pid2 = spawn(Mod, Func, Args)

簡単なメッセージ送信(Simple Message Passing)

  プロセスA(送信側)

    B!{self(), foo}.

  プロセスB(受信側)

    recieve

      {From, Msg} -> Actions ...

    end

  組込関数self()は自分自身のPidを取得する。

  この場合、受信側で

    From = プロセスAのPid

    Msg = foo

  が入る

  

  プロセスA(送信側)

    B!{self(), {digits, [1, 2, 6] }.

  プロセスB(受信側)

    recieve

      {A, { digits, D } } -> analyse(D);

    end

  この場合、受信側で

    A = プロセスAのPid

    D = [1, 2, 6]

   が入るので、analyse([1, 2, 6])が実行される。

   すでに A が代入済みの場合は、データのみ

   受け入れ(accept)られる。

   ※こういうことか?

    recieve

      { _, { digits, D } } -> analyse(D).

    end

エコープロセスの例(An Echo process)

  -module(echo).

  -export([go/0, loop/0]).

  go() ->

      Pid2 = spawn(echo, loop, []),

      Pid2 ! {self(), hello},

      receive

          {Pid2, Msg} ->

              io:format("P1 ~w~n",[Msg])

      end,

      Pid2 ! stop.

  loop() ->

      receive

          {From, Msg} ->

              From ! {self(), Msg},

              loop();

          stop ->

              true

      end.

  go()で送信側。Pid2(受信側)プロセスを生成し、

  文字列メッセージを送る。Pid2からの文字列メッセージを待ち、

  受信したら Pid2に終了メッセージを送る。

  loop()は受信側。

  文字列メッセージと終了メッセージがある。

  文字列メッセージは、送信元に同じ文字列メッセージを返す。

  終了メッセージも受け取る(実行が停止する)。

  実行方法

   echo.erl に保存して、

   > c(echo).

   > echo:go().

   P1 hello

   stop

   >

- - -

もくじ

Eralng Course: Module 3 - Concurrent Programming

http://www.erlang.org/course/concurrent_programming.html