0
、簡単なモジュールのメソッド呼び出しに一例として をタイムアウトを適用する方法はあり、Erlangのメソッドでタイムアウトを適用するには?
私は上記の方法にタイムアウトオプションを追加したいmy_method(Name)->
timer:sleep(2000),
io:format("hello world ~p!~n",[Name]).
、それを行う方法はありますか?
、簡単なモジュールのメソッド呼び出しに一例として をタイムアウトを適用する方法はあり、Erlangのメソッドでタイムアウトを適用するには?
私は上記の方法にタイムアウトオプションを追加したいmy_method(Name)->
timer:sleep(2000),
io:format("hello world ~p!~n",[Name]).
、それを行う方法はありますか?
あなたの関数を生成し、メッセージを返すのを待つことができます。受信を待つ間にタイムアウトを設定することができます。
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.
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.
"適用/追加タイムアウト"とはどういう意味ですか?関数を呼び出して一定期間応答を待って、その期間内に応答しない場合はエラーを返します。 – Dogbert
@Dogbert、yes正確に.. – Hasitha
gen_serverを使用するか、単純なプロセスを生成するかにかかわらず、呼び出しを実行するプロセスと、結果またはタイムアウトを待つプロセスの2つのプロセスが必要です。そして考えるべきことがいくつかあります。タイムアウトが発生した場合は、未完了コールについて何をすべきかを決定する必要があります。それを終了するか、完了するまで実行しますが、最終的な戻り値を削除しますか?あなたがそれを殺すと、その呼び出しに副作用がある場合には矛盾した状態が残る可能性がありますか? – RichardC