2011-09-20 15 views
8

Tengo un supervisor con N procesos de trabajo. Como de costumbre, el supervisor puede enviar un mensaje a un proceso de trabajo y hay un handle_cast que envía una respuesta de un trabajador al supervisor.Supervisor de Erlang: cómo verificar si todos los trabajadores han respondido

¿Cómo puedo verificar que todos los N trabajadores hayan respondido al supervisor? ¿Es posible implementar esto con cualquier tipo de manejo de eventos? Por ejemplo, decirle al supervisor "Ok, todos respondieron" y no hacer que el supervisor verifique el estado "Todos los procesos han respondido" cada segundo en algún tipo de ETS tabla de registro infantil?

Respuesta

8

Si está hablando de una OTP supervisor, no, no puede enviar un mensaje a un trabajador desde ella. Un supervisor es un comportamiento muy limitado con el propósito de iniciar , monitoreo, reiniciar y parar procesos. Nada más.

Para resolver su problema en particular, debe tener un proceso que sea responsable de enviar un mensaje a todos los trabajadores. Este proceso también podría mantener una lista de todos los trabajadores en su estado, "marque" (o elimine de la lista) a los trabajadores que han respondido. Puede lograr esto con una lista de PID y recibiendo respuestas de los procesos (o supervisando los procesos con erlang:monitor/2 si están saliendo cuando terminan) y vea quién queda.

3

Una alternativa - que podría (o no podría) aplicarse a su caso es usar el comportamiento gen_event.

RENUNCIA

digo " podía" porque depende de lo que sus "trabajadores" pueden hacer en su caso específico. Si está interesado en el contenido de sus respuestas, puede preferir no utilizar este enfoque, pero en el caso que le interese solo que todos los trabajadores hayan completado sus tareas, por ejemplo, los procesos de los trabajadores hacen cálculos importantes. y almacena su resultado parcial en una base de datos, por lo que está listo para combinar los parciales, gen_event podría ser el camino a seguir.

FIN DE RENUNCIA

Entonces ...

En OTP, un gestor de eventos es un objeto llamado a los eventos que se pueden enviar.

Los eventos son mensajes.

En el administrador de eventos, se instalan cero, uno o varios controladores de eventos. Cuando se notifica al administrador de eventos sobre un evento, todos los controladores de eventos instalados procesan el evento.

Así que, básicamente, en lugar de tener un supervisor y varios trabajadores, tiene un administrador de eventos y varios controladores de eventos.

continuación, se puede utilizar la función de gen_event:sync_notify/2:

sync_notify es sincrónico, en el sentido que le proporcione bien después el evento ha sido procesado por todos los controladores de eventos.

Para obtener más información acerca de la gen_event * * buscar y herethere.

Cuestiones relacionadas