Знание 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
также возвращает уже завершенные дочерние элементы.
Так что было бы лучше, еслидети будут удалены после того, как они временно прекратят свое существование.
Каким-то образом все это кажется мне не изящным, поэтому я спрашиваю себя (и вас):
Как я могу решить это наиболее элегантно?
Не лучше ли вообще использовать супервизора в этой ситуации?