Eralng Course: Module 3 - Concurrent Programming 中編

もくじ

選択的メッセージ受信 (Selective Message Reception)

  以下のとき、メッセージの発信順序とは関係なく、

  foo, bar の順に受信処理される。

    recieve

      foo -> true

    end,

    recieve

      bar -> true

    end

どのメッセージも選択 (Selection of any message)

  以下の場合、変数Msgにどんなメッセージでも束縛される。

  (変数書き換えはないので)到着順で、最初のメッセージが束縛、処理される。

    receive

      Msg -> ...

    end

  ※たぶん、その後も同じ値がきたときだけ、処理されるだろう。

例: 通話 (A Telephony Example)

  AからBに電話をかける。この状態をCallというプロセスで表現

  ringing_a(A, B) ->

    receive

      {A, on_hook} ->

        A ! {stop_tone, ring},

        B ! terminate,

        idle(A);

      {B, answered} ->

        A ! {stop_tone, ring},

        switch ! {connect, A, B},

        conversation_a(A, B)

    end.

    AとBはプロセスCall内のローカル変数。

    (なので、誰と誰でも通話できる。)

    ※こんなかんじ?

       1. ringing_a(A, B)で電話をかけ、状態遷移待ち。

         Aの受話器からはダイアルトーンが流れている。

         Bの受信ベルがなっている状態。

       2. {A, on_hook}: Aが受話器を置く。

         Aのダイアルトーンを止め、Bのベル音終了、

         Aは次のイベント待ち。

       3. {B, answered}: Bが受話器をとり、応答。

         Aのダイアルトーンを止め、

         交換機にAとBの接続を指示。

         AとBの通信開始。

プロセスIDもメッセージで送れる(Pids can be sent in messages)

  プロセスA

    B ! { transfer, self() }

  プロセスB

    receive

      {transfer, A} -> C ! {transfer, A}

    end

  プロセスC

    receive

      {transfer, A} -> A ! {transfer, A}

    end

   プロセスCがプロセスAを直接呼び出している

- - -

 もくじ

Eralng Course: Module 3 - Concurrent Programming

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