receive構文でのタイムアウト
Getting Started With Erlangの続き。ちょい忙しいので「4.1 Timeouts」だけ。
receive構文でのタイムアウト
receive構文では、メッセージ待ち受けがタイムアウトした場合の処理を指定することができます。以下の形式で書きます。
receive <パターン> -> <処理>; <パターン> -> <処理>; <パターン> -> <処理> after <タイムアウト待ち時間> -> <タイムアウト時に実行する処理> end.
- タイムアウト時間には待ち時間をミリ秒で指定します。
- receiveの最後の処理にも、afterの最後の処理にも「;」はつかないので注意。
例としていつものサンプルにタイムアウトを追加してみました。
-module(kitten). -export([start/1, run/1]). % ねこサーバー。 % メッセージに応じて一定のアクションを行う。 % プロセスには"kitten"の名前で登録される。 start(Name) -> PID = spawn( kitten, run, [Name] ), register(kitten, PID). run( Name ) -> receive run -> io:format( "~w : run!~n", [Name] ), run(Name); jump -> io:format( "~w : jump!~n", [Name] ), run(Name); stop -> io:format( "~w : stop~n", [Name] ), run(Name); sleep -> ok % メッセージが送付されなかった場合のタイムアウト処理 % afterに続けて待ち時間をミリ秒で指定する。 after 5000 -> io:format( "~w : wait..~n", [Name] ), run(Name) end.
実行し、しばらく放置するとタイムアウトのメッセージが出力されます。
2> kitten:start(mii). true 3> mii : wait.. 3> mii : wait.. 3> mii : wait.. 3> mii : wait..