2012-10-10 24 views
7

Tengo un supervisor con una estrategia de reinicio one_for_one. ¿Es posible establecer un intervalo de tiempo entre el reinicio del proceso secundario?Intervalo de reinicio del supervisor de Erlang

F.e. db remoto aplastado y quiero esperar 10 segundos entre la restauración del intento de conexión.

Respuesta

4

En realidad, se puede dejar que el supervisor para reiniciar inmediatamente a sus hijos y poner en práctica lo que se llama inicialización perezosa:

  1. El supervisor (re) comienza (inmediatamente) el niño (por ejemplo, un gen_server)
  2. el gen_server devuelve un 0 tiempo de espera en su función init
  3. en el handle_info haces una espera activa (los 10 segundos) para asegurar la base de datos se ha inicializado correctamente

De esta manera, se asegura de que todas las solicitudes al gen_server se procesen después de que el DB se haya inicializado correctamente.

+0

Gracias, pero no he tenido problema con gen_server init, quiero un intervalo de tiempo (reposo) entre el intento de reinicio. – kolchanov

+2

Creo que lo que sugiere @Robert Aloi funcionará. El init de gen_server no intentará reconectarse, sino que devuelve el tiempo de espera de 0 que satisfará al supervisor que el niño ha iniciado. Luego, en la función handle_info, realiza la inicialización "real" ... Después de dormir durante 10 segundos – Jr0

+0

O incluso mejor después de asegurarse de que el DB está activo. Esperar una cantidad fija de tiempo es la raíz de todos los males. –

Cuestiones relacionadas