supervisor:start_node で子プロセスをいくつも動的に追加する

色々勘違いしていたので整理。
supervisor:start_node で子プロセスが起動しなかったのは

  • mio_node:supervisor で gen_server:start_link({local, ?SERVER}, ?MODULE, Args, []). していたから
    • ?SERVER が key で register されてしまうので次の起動時に already_started になってしまう
  • 代わりに gen_server:start_link(?MODULE, Args, []). とすれば良い。
    • ただし register されなくなるので ! mio_node などができなくなる。
    • テストのために 1 プロセスだけ名前をつけたいなら start_child 後、明示的に start_child すべし


また child specification で指定する id も重複してはいけない。
名前の部分を getRandomId にすれば良い。

    Pid = supervisor:start_child(mio_sup, {getRandomId(),
                                            {mio_node, start_link, [[myKey, myValue]]},
                                            permanent, brutal_kill, worker, [mio_node]}),
getRandomId() ->
    integer_to_list(crypto:rand_uniform(1, 65536 * 65536)).

supervisor の start_link などで crypto:start/0 を呼ぶのを忘れない事。