« [メモ] Eralng Course: Module 3 - Concurrent Programming 前編 | メイン | [メモ] Eralng Course: Module 3 - Concurrent Programming 後編 »

2007年6月21日

[メモ] 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

投稿者 kawaguti : 2007年6月21日 00:43

トラックバック(0)

このブログ記事を参照しているブログ一覧: [メモ] Eralng Course: Module 3 - Concurrent Programming 中編

このブログ記事に対するトラックバックURL: http://do-gugan.com/cgi-bin/mt/mt-tb.cgi/2012

コメントする