2017-06-19 13 views
0

、簡単なモジュールのメソッド呼び出しに一例として をタイムアウトを適用する方法はあり、Erlangのメソッドでタイムアウトを適用するには?

私は上記の方法にタイムアウトオプションを追加したい
my_method(Name)-> 
    timer:sleep(2000), 
    io:format("hello world ~p!~n",[Name]). 

、それを行う方法はありますか?

+0

"適用/追加タイムアウト"とはどういう意味ですか?関数を呼び出して一定期間応答を待って、その期間内に応答しない場合はエラーを返します。 – Dogbert

+0

@Dogbert、yes正確に.. – Hasitha

+0

gen_serverを使用するか、単純なプロセスを生成するかにかかわらず、呼び出しを実行するプロセスと、結果またはタイムアウトを待つプロセスの2つのプロセスが必要です。そして考えるべきことがいくつかあります。タイムアウトが発生した場合は、未完了コールについて何をすべきかを決定する必要があります。それを終了するか、完了するまで実行しますが、最終的な戻り値を削除しますか?あなたがそれを殺すと、その呼び出しに副作用がある場合には矛盾した状態が残る可能性がありますか? – RichardC

答えて

1

あなたの関数を生成し、メッセージを返すのを待つことができます。受信を待つ間にタイムアウトを設定することができます。

my_method(Name)-> 
    YourTimeOut = 10, 
    Self = self(), 
    _Pid = spawn(fun()-> 
        timer:sleep(2000), 
        io:format("hello world ~p!~n",[Name]), 
        Self ! {self(), ok} end), 
    receive 
    {_PidSpawned, ok} -> ok 
    after 
    YourTimeOut -> timout 
    end. 
1

gen:call/3,4の実装を参照してください。それは行われます

do_call(Process, Label, Request, Timeout) -> 
    try erlang:monitor(process, Process) of 
    Mref -> 
     %% If the monitor/2 call failed to set up a connection to a 
     %% remote node, we don't want the '!' operator to attempt 
     %% to set up the connection again. (If the monitor/2 call 
     %% failed due to an expired timeout, '!' too would probably 
     %% have to wait for the timeout to expire.) Therefore, 
     %% use erlang:send/3 with the 'noconnect' option so that it 
     %% will fail immediately if there is no connection to the 
     %% remote node. 

     catch erlang:send(Process, {Label, {self(), Mref}, Request}, 
      [noconnect]), 
     receive 
     {Mref, Reply} -> 
      erlang:demonitor(Mref, [flush]), 
      {ok, Reply}; 
     {'DOWN', Mref, _, _, noconnection} -> 
      Node = get_node(Process), 
      exit({nodedown, Node}); 
     {'DOWN', Mref, _, _, Reason} -> 
      exit(Reason) 
     after Timeout -> %% <-- HERE 
      erlang:demonitor(Mref, [flush]), 
      exit(timeout) 
     end 
    catch 
    error:_ -> 
     %% Node (C/Java?) is not supporting the monitor. 
     %% The other possible case -- this node is not distributed 
     %% -- should have been handled earlier. 
     %% Do the best possible with monitor_node/2. 
     %% This code may hang indefinitely if the Process 
     %% does not exist. It is only used for featureweak remote nodes. 
     Node = get_node(Process), 
     monitor_node(Node, true), 
     receive 
     {nodedown, Node} -> 
      monitor_node(Node, false), 
      exit({nodedown, Node}) 
     after 0 -> 
      Tag = make_ref(), 
      Process ! {Label, {self(), Tag}, Request}, 
      wait_resp(Node, Tag, Timeout) %% <-- HERE for C/Java nodes 
     end 
    end. 
関連する問題