Вам не нужны два разных модуля только для запуска двух экземпляров одного и того же сервера.Проблема конфликта связана с тегом в дочерней спецификации, который должен быть уникальным.Это первый элемент в кортеже.Таким образом, вы можете получить что-то вроде:
[{echo_server, {echo_server, start_link, []},
permanent, brutal_kill, worker, [echo_server]},
{echo_server2, {echo_server, start_link, []},
permanent, brutal_kill, worker, [echo_server]}]}}.
Почему вы отсоединяете дочерние процессы?Руководитель использует эти ссылки, чтобы контролировать своих детей.Ошибка, которую вы получаете, заключается в том, что супервизор ожидает, что функции, которые запускают дочерние элементы, возвращают {ok,ChildPid}
, именно так он получает pid дочерних элементов, поэтому, когда он получает другое возвращаемое значение, он не запускается при запуске дочерних элементов и затемдо себя.Все в соответствии с тем, как это должно работать.
Если вы хотите зарегистрировать оба сервера, вы можете изменить функцию start_link
так, чтобы имя использовалось в качестве аргумента и передавалось, чтобы вы могли явно передать его вчерез детскую спец.Итак:
start_link(Name) ->
gen_server:start_link({local, Name}, ?MODULE, [], []).
и
[{echo_server, {echo_server, start_link, [echo_server]},
permanent, brutal_kill, worker, [echo_server]},
{echo_server2, {echo_server, start_link, [echo_server2]},
permanent, brutal_kill, worker, [echo_server]}]}}.
Использование имени модуля в качестве зарегистрированного имени для сервера - это всего лишь соглашение, которое работает только при запуске одного экземпляра сервера.