私は15秒ごとにいくつかの作業を行う必要があるプロセスがあります。私は現在、このようにそれをやっている:Erlangで定期的に何かを行う最良の方法は何ですか?
-behavior(gen_server). interval_milliseconds()-> 15000. init()-> {ok, _State = FascinatingStateData, _TimeoutInterval = interval_milliseconds() }. %% This gets called automatically as a result of our handlers %% including the optional _TimeoutInterval value in the returned %% Result handle_info(timeout, StateData)-> {noreply, _State = do_some_work(StateData), _TimeoutInterval = interval_milliseconds() }.
これは動作しますが、それは非常に脆いです:私は私のサーバーに新しいメッセージを教えたい場合、私はすべての新しいハンドラ関数を書くとき、私は含めるように覚えています戻り値のオプションのタイムアウト間隔。
%% Someone wants to know our state; tell them handle_call(query_state_data, _From, StateData)-> {reply, StateData, _NewStateData = whatever(), interval_milliseconds()};
代わりの
%% Someone wants to know our state; tell them handle_call(query_state_data, _From, StateData)-> {reply, StateData, _NewStateData = whatever()};
お察しの通り、私は非常に数を間違えていること作った:それは、私が同期呼び出しを処理していた場合、私はこれを行う必要があると言っています回。コードがquery_state_dataメッセージを処理すると、タイムアウトが生成されなくなり、サーバー全体が停止するため、コードは厄介です。 (私はマシン上でシェルを取得し、手で "タイムアウト"メッセージを送ることによって手動で "除細動"することができます...)
これで、オプションのタイムアウトパラメータ私の結果値に。しかし、それは縮尺どおりではありません。私はいつか忘れて、このバグをもう一度見つめていきます。だから、より良い方法は何ですか?
私は永遠に走る実際のループを書いて、睡眠のほとんどを過ごすとは思っていません。それはOTPの精神に反するようです。 send_interval/2:
Erlangに触れてから数年が経ちましたが、これは私が何をしているかのように見えます。ありがとう。 – offby1