Как автоматически удалить спецификации завершенных потомков в динамическом супервизоре - PullRequest
2 голосов
/ 13 марта 2011

Знание USB не требуется для этого вопроса, я просто описал его, чтобы сделать пример более конкретным.

Я пытаюсь реализовать динамический диспетчер для определенных устройств нашина USB.Эти устройства имеют адреса, появляются и исчезают в течение всего срока службы системы.

Для каждого устройства мне нужен динамический дочерний элемент для моего супервизора.

Эти дочерние элементы являются временными, поэтому после их сбоя или прекращения мы не перезапускаем их (потому что, вероятно, их уже нет).

У меня есть процесс, который сканирует порт USB в определенное время и выдает список всех адресов USB-устройств, которые я хочу обработать.

Я планирую звонить supervisor:which_children/1 перед каждым сканированиемчтобы выяснить, какие устройства присутствуют, но у которых нет дочерних процессов.

Чтобы выяснить, по каким адресам работают дочерние элементы, я планирую создать атомы Id для дочерних спецификаций, которые содержат адреса (адресов всего несколько.возможно), например adr_12, если дочерний элемент обрабатывает адрес 12.

Когда я пытаюсь запустить / перезапустить отсутствующие дочерние элементы, у меня возникает несколько уродливая ситуация, когда спецификации дочерних элементов не удаляются автоматически, когда завершается переходный дочерний элементили вылетает (по крайней мере, я думаю, что это так).Поэтому мне нужен код, подобный следующему:

case supervisor:start_child(my_sup, Spec) of
    {error, already_present} ->
        supervisor:restart_child(my_sup, Spec);
    Any -> Any
end

Тогда есть проблема, которую я не знаю, если supervisor:which_children/1 также возвращает уже завершенные дочерние элементы.

Так что было бы лучше, еслидети будут удалены после того, как они временно прекратят свое существование.

Каким-то образом все это кажется мне не изящным, поэтому я спрашиваю себя (и вас):

Как я могу решить это наиболее элегантно?

Не лучше ли вообще использовать супервизора в этой ситуации?

Ответы [ 2 ]

2 голосов
/ 13 марта 2011

Моя внутренняя реакция / реакция на колено: «Вам нужно использовать супервизора simple_one_for_one», поэтому их спецификация будет удалена, когда она остановится. Если вам нужно иметь возможность получить определенный процесс для связи, я бы использовал для этого приложение gproc (или таблицу ETS).

1 голос
/ 13 марта 2011

Мне кажется, что дети, которых вы хотите динамически добавить к своему руководителю, очень похожи друг на друга.Возможно, вам нужен простой-один-на-один супервизор.Эти супервизоры являются «упрощенной версией супервизора one_for_one, где все дочерние процессы являются динамически добавляемыми экземплярами одного и того же процесса».У каждого дочернего элемента будут одинаковые дочерние спецификации, поэтому вам не нужно указывать его при вызове supervisor:add_child/2.

. Также имейте в виду, что приведенная выше идея создания атома (например, adr_12) динамическиможет быть опасно.Атомы ограничены в системе Эрланга (по умолчанию ~ 1000000).Подробности смотрите в документации.

...