2010-12-03 9 views
5

Tengo un módulo lógico que le dice a un supervisor que inicie procesos secundarios. Necesito almacenar esos pid de niños en el estado de módulos lógicos. Pero también necesito actualizar un pid de childs si el supervisor lo reinicia.Registrar un hijo en el proceso que inició la llamada start_child

Así que no puedo usar el valor de retorno pid de la llamada start_child, ya que eso solo me dará el pid en el primer inicio, no en el reinicio. En este momento hago que el proceso hijo invoque una función de registro (estado de actualización con el nuevo pid) en el módulo lógico de la función init del niño. De esta forma, el módulo lógico puede actualizar el pid en su estado cada vez que se reinicia un proceso. El módulo lógico es gen_server y estoy haciendo un yeso cuando registro el proceso hijo.

¿Alguien puede ver un problema con esto y hay alguna otra forma más "adecuada" de hacerlo?

Respuesta

6

Un problema es que tiene el ChildPid y el niño podría estar muerto por ahora. Por lo que enviar un mensaje a través de cast significará que el mensaje se pierde. Y a través de un call se bloqueará con un {'EXIT', noproc} a menos que lo atrape del call. Su solución debe tener en cuenta que un Pid desapareció en el momento en que envía un mensaje. Por lo general, ignorando que el mensaje se pierde, al colgarse, o al remediar el problema y luego seguir.

Hay un par de opciones. Esta es una lista suelta:

  • Haz lo que hagas. Deje que los niños se registren.
  • Deje que el módulo lógico tenga un monitor en el niño. De esa forma sabrás si muere.
  • Soluciones Uso Erlanggproc módulo: https://github.com/esl/gproc que le da una interfaz limpia a una pista de mantener la tabla de ETS de la información. Tenga en cuenta que puede buscar un pid en gproc y esperando su llegada si el proceso recién se está reiniciando.
  • Usa supervisor:which_children para encontrar el niño relevante.
  • rodar su propia tabla de ETS como una variante de gproc
  • nombres locales tiene que ser átomos, pero registrados a nivel mundial nombres pueden ser cualquiera de los términos (que se almacenan internamente en una tabla ETS buscando algo así como de gproc, ver el global_name_server en kernel/stdlib). Usa la estructura global para rastrear los pides en cuestión.
Cuestiones relacionadas