Для ответа на этот вопрос знание USB не требуется, я просто описал его так, как он есть, чтобы сделать пример более конкретным.
Я пытаюсь реализовать динамический супервизор для определенных устройств на шине USB. Эти устройства имеют адреса и появляются и исчезают в течение срока службы системы.
Для каждого устройства мне нужен динамический ребенок для моего руководителя.
Эти дочерние элементы являются временными, поэтому, как только они падают или завершают работу, мы не перезапускаем их (потому что, вероятно, тогда они исчезнут).
У меня есть процесс, который сканирует USB-порт в определенное время и создает список всех адресов USB-устройств, которые я хочу обработать.
Я планирую вызывать supervisor:which_children/1
перед каждым сканированием, чтобы узнать, какие устройства присутствуют, но не имеют запущенных дочерних процессов.
Чтобы узнать, на каких адресах работают дочерние элементы, я планирую создать атомы идентификаторов для дочерней спецификации, которые содержат адреса (возможны только несколько адресов), например. 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
уже завершенных детей.
Поэтому было бы лучше, если бы потомки удалялись после их временного завершения.
Как-то все это кажется мне неэлегантным, поэтому я спрашиваю себя (и вас):
Как я могу решить это наиболее элегантно?
Не лучше ли вообще не использовать супервайзер в этой ситуации?