1

OTP を学習するために map/reduce ワード カウンターを作成しています。レデューサーを開始できる simple_one_for_one スーパーバイザーを作成しました。すべてのキーについて、すでに子が存在するかどうかを確認したいと思います。存在しない場合は、スーパーバイザーに子を作成させます。

私は現在、次のようにスーパーバイザー モジュールで子を開始します。

start_child(Key) ->
    supervisor:start_child(?SERVER, [Key]).

私はこのようなことをしたいと思います(未テスト):

start_child(Key) ->
    case supervisor:child_pid(Key) of
    Pid -> Pid;
    _ -> supervisor:start_child(?SERVER, [Key])
    end.

Key の子が既に存在するかどうかを調べる OTP の良い方法は何ですか?

4

1 に答える 1

2

以下を開始するスーパーバイザーを構築します。

  • gen_server。それを呼びましょうreducer_server
  • simple_one_for_oneスーパーバイザー。それを呼びましょうreducer_sup

reducer_supの前にメインスーパーバイザーが起動することを確認してくださいreducer_server。の状態は、reducer_serverKey->Pidペアの辞書である可能性があります。reducer_server次にreduce(Key)、辞書でキーを見つけて対応するプロセスを知っているか、キーを見つけずに次のような関数を実行するような関数があります。

new_reduce(Key) ->
    case supervisor:start_child(reducer_sup, [Key]) of
        {ok, Pid} when is_pid(Pid) -> {ok, Pid};
        {ok, Pid, _} when is_pid(Pid) -> {ok, Pid};
        _ -> error
    end.

結果のpidを状態に追加するだけで、次のへの呼び出しの準備が整いますreduce/1。これらすべての部分がどのように連携するかをよりよく理解するために、これこれを読むことをお勧めします。このコードを実稼働環境に配置する場合は、次のようなことを検討することをお勧めします。

  • プロセスが停止するとどうなりますか?ヒント:で活気を確認してくださいis_process_alive/1
  • reducer_serverどちらかreducer_supが死んだ場合はどうなりますか?
于 2011-05-29T21:32:49.210 に答える