0

動作が gen_server の erlang モジュールがあります。

今私が持っています:

init(_Args) ->
    erlang:send_after(?PROCESS_STATE_INTERVAL,self(),processState),
    {ok, []}.

handle_info(processState, _State)->
    {ok, NewState} = gen_server:call(self(), {updateLvls}), %works fine, tested
    timer:send_after(?PROCESS_STATE_INTERVAL,self(),processState),
    {noreply, NewState}.

{ok, Test}=gen_server:start_link({local,challenge_manager},challenge_manager,[],[]).数秒後に次のようなもので開始すると、** exception error: {timeout,{gen_server,call,[<0.329.0>,{updateLvls}]}}

私は何か間違ったことをしていますか??

4

1 に答える 1

10

それ自体から自分自身を呼び出すことはできませんgen_server。その結果、デッドロックが発生します (これが表示されます)。サーバープロセスは最初のリクエストの処理でビジーであり (まだ戻っていないため)、2 番目のリクエスト (最初のリクエストの処理から作成されたもの) をキューに入れるため、デッドロックになります。

handle_callこれを解決するには、 と の両方をhandle_info使用するライブラリ関数を作成するか、reply/2非同期応答を実行できる関数を調べます (関数{noreply, ...}から戻る場合handle_call)。

于 2012-02-27T13:28:09.457 に答える