Сбор информации о работниках simple_one_for_one - PullRequest
2 голосов
/ 28 июня 2011

У меня есть супервайзер (называемый Алисой), который запускает группу рабочих_one_for_one.Теперь я хотел бы получить информацию обо всех работах вместе.Например, предположим, что работники являются TCP-серверами, и я хотел бы получить все номера портов, используемые работниками, или все удаленные адреса, которые связаны с этими работниками.Где я должен разместить эту функцию?

Supervisor не имеет функции gen_server и не может отвечать на вызовы.Таким образом, мне кажется, наиболее разумным способом является наличие другого супервизора (называемого bob), который порождает супервизора alice и другого gen_server (charile), который реализует вызовы типа {get, ports_used_by_alices_workers}, вызывая supervisor: which_children (alice) и затем спрашиваяребенок каждой Алисы для своего порта.Итак, charile - брат Алисы и отвечает на звонки о детях Алисы.Это нормально?Или есть более элегантный способ сделать это?

1 Ответ

3 голосов
/ 28 июня 2011

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

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

[{Child, 
  %% Query linked port for socket information
  [{Link, prim_inet:sockname(Link),
          prim_inet:peername(Link)}
    || %% get list of linked process and ports for process 'Child'
       Link <- element(2, process_info(Child, links)),
       %% filter down to linked ports.
       is_port(Link)] 
  }
 %% Map over all children of the supervisor 'Sup'.
 || Child <- [Pid || {_,Pid,_,_} = supervisor:which_children(Sup)] 
 ]

Вы можете получить представление о доступной в источнике информации для inet: i / 0 .

...