4

gen_server に「スーパーバイザーがすべての gen_servers を初期化しました。メッセージを送信できるようになりました」と伝える方法はありますか?

監視ツリー内の他の gen_servers の状態を設定する仕事をしているワーカー gen_server がいます。構成サーバーの init 関数でメッセージの送信を開始すると、{noproc, _} になることがあります。これは、構成サーバーが速すぎたことを意味していると思います。スーパーバイザーがすべてのワーカーを開始するのに十分な時間がある前に、彼はメッセージを送信しました。config_server:init() に timer:sleep(500) を配置することでこれを修正しました。これにより、すべての gen_server が初期化するのに十分な時間が確保されますが、これは洗練されていないソリューションのように思えます。

これを行う適切な方法はありますか?

4

3 に答える 3

3

0からのタイムアウトでタプルを返しinitます。その後、戻った直後にhandle_info(timeout, State)呼び出されます。handle_infoスーパーバイザーが初期化を完了するまで返されない呼び出しを行います (例: ) supervisor:which_children

于 2011-06-25T04:12:28.153 に答える
0
info(PlayerId) ->
Pid = case global:whereis_name(util:getRegName({?MODULE, PlayerId})) of
    P when is_pid(P) ->
        P;
    _ ->
        {ok, P} = player_sup:start_child(PlayerId),
        P
end,
gen_server:call(Pid, info).

これは、この問題を処理する私のケースです。このワーカー プロセスは、要求された場合にのみトリガーされます。

于 2011-06-25T14:31:18.220 に答える
0

関数init()呼び出しでgen_server:cast(init, State)。メッセージ「init」はメッセージキューの最初になります

于 2011-06-25T08:10:41.760 に答える