Eralng Course: Module 3 - Concurrent Programming 後編

もくじ

登録されたプロセス (Registered Processes)

  register(Alias, Pid) プロセスID: Pid のプロセスを別名(Alias)に登録

    start() ->

      Pid = spawn(num_anal, server, [])

      register(analyser, Pid).

    

    analyse(Seq) ->

      analyser ! {self(),{analyse,Seq}},

      receive

        {analysis_result,R} ->

          R

      end.

  「登録されたプロセス」へは、どのプロセスからでも

  メッセージを送ることができる。

クライアントサーバモデル (Client Server Model)

  メッセージ定義

     要求: {request, Req}

     応答: {reply, Rep}

  サーバのコード

    -module(myserver).

    server(Data) ->

      receive

        {From,{request,X}} ->

          {R, Data1} = fn(X, Data),

          From ! {myserver,{reply, R}},

            server(Data1)

      end.

  インタフェースライブラリ ( Interface Library ) = クライアント側

    -export([request/1]).

    request(Req) ->

      myserver ! {self(),{request,Req}},

        receive

          {myserver,{reply,Rep}} ->

            Rep

    end.

  ※クライアント-サーバモデルはメッセージ通信で

    簡単にかけるよ、と。「それメッセージで出来るよ。」

タイムアウト (Timeouts)

  [ time ] --("tick")--> [ B ] <--(foo)-- [A]

    receive

      foo -> Actions1;

    after

      Time -> Action2

    end

  もしメッセージ foo を 時間Timeまでに A から

  受け取っていたら Actions1を行い、そうでな

  ければActions2を行う。

タイムアウトの使いかた (Uses of Timeouts)

  sleep(T) - Tミリ秒の間、プロセスを止める

    sleep(T) ->

      receive

      after

        T ->

          true

      end.

  suspend() - プロセスを無期停止

    suspend() ->

      receive

      after

        infinity ->

          true

      end.

  alarm(T, What) - メッセージWhatはTミリ秒後にプロセスに届く

    set_alarm(T, What) ->

      spawn(timer, set, [self(),T,What]).

    set(Pid, T, Alarm) ->

      receive

      after

        T ->

          Pid ! Alarm

      end.

      receive

        Msg ->

          ... ;

      end

  flush() - メッセージバッファの吐き出し(flush)

    flush() ->

      receive

        Any ->

          flush()

      after

        0 ->

          true

      end.

   タイムアウト(after)のあとにある値0は、メッセージ

   バッファをまずチェックして、何もなければ、

   続くコードを実行する、ということを意味する。

- - -

 もくじ

Eralng Course: Module 3 - Concurrent Programming

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