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 を呼ぶのを忘れない事。