2011-07-16 20 views
15

Después de ver la pantalla de Pragmatic Studio en Erlang, el último video sobre Supervisores mencionó que para que un supervisor reciba una notificación sobre uno de sus hijos para que pueda reiniciarlo correctamente, el el niño debe registrarse con process_flag(trap_exit, true). Tal vez simplemente interpreté mal al autor (y las posibilidades son MUY elevadas que malinterpreté), pero pensé que los supervisores saben automágicamente cuándo mueren sus hijos (probablemente a través de spawn_link o algo similar de fondo). ¿Es esto realmente necesario? ¿Cuándo se debe utilizar process_flag (trap_exit, true) en un caso en el mundo real debido a que la documentación indica explícitamente lo siguiente:Erlang y process_flag (trap_exit, true)

http://www.erlang.org/doc/man/erlang.html#process_flag-2

process_flag (trap_exit, Boolean)

Cuando se establece trap_exit a true, las señales de salida que llegan a un proceso se convierten a {'EXIT', From, Reason} mensajes, que pueden recibirse como mensajes ordinarios. Si trap_exit se establece en falso, el proceso finaliza si recibe una señal de salida distinta de la normal y la señal de salida se propaga a sus procesos vinculados. Los procesos de aplicación normalmente no deberían trampa exits.``

+0

La necesidad de establecer el indicador trap_exit en una aplicación OTP es de hecho una situación excepcional. La mayoría de las aplicaciones OTP no necesitan establecer el indicador trap_exit explícitamente ya que los supervisores están diseñados para manejarlos correctamente de acuerdo con las especificaciones del niño. –

Respuesta

24

Tienes 3 idiomas:

1/No me importa si mi niño muere proceso:

spawn(...) 

2/I quiero colapsar si mi hijo se bloquea:

spawn_link(...) 

3/Quiero recibir un mensaje si mi c termina Hild de proceso (normalmente o no):

process_flag(trap_exit, true), 
spawn_link(...) 

favor ver este ejemplo y probar diferentes valores (inversa con 2 o 0 para provocar una excepción, y utilizando trap_exit o no):

-module(play). 
-compile(export_all). 

start() -> 
    process_flag(trap_exit, true), 
    spawn_link(?MODULE, inverse, [2]), 
    loop(). 

loop() -> 
    receive 
     Msg -> io:format("~p~n", [Msg]) 
    end, 
    loop(). 

inverse(N) -> 1/N. 
+0

Re # 1 - A menudo pienso eso, pero luego me doy cuenta de que quiero que ese proceso salga cuando mi sistema se apaga. Para eso están los niños con supervisión temporal. – Dustin

+0

No creo que esto realmente responda la pregunta ... –

+0

Creo que también. Creo que @rvirding ha dado la respuesta correcta a la pregunta –

27

Supervisores utilice enlaces y salidas de trampa para que puedan hacer un seguimiento de sus hijos y reiniciarlos cuando sea necesario. Los procesos secundarios hacen no tienen que atrapar las salidas para que sean administradas adecuadamente por sus supervisores, de hecho, solo deben interceptar cuando necesitan específicamente saber que algún proceso al que están vinculados muere y no quieren bloquearse.

Los comportamientos de OTP pueden controlar adecuadamente la supervisión si están atrapados o no atrapados.

14

En Erlang, los procesos pueden ser vinculados juntos. Estos enlaces son bidireccionales. Cada vez que un proceso muere, envía una señal de salida a todos los procesos vinculados. Cada uno de estos procesos tendrá activada o desactivada la marca trapexit. Si el indicador está desactivado (predeterminado), el proceso vinculado se bloqueará tan pronto como reciba la señal de salida. Si el indicador ha sido habilitado por una llamada al system_flag(trap_exit, true), el proceso convertirá la señal de salida recibida en un mensaje de salida y no se se bloqueará. El mensaje de salida se pondrá en cola en su buzón y se tratará como un mensaje normal.

Si está utilizando supervisores OTP, ellos se encargan de los indicadores trap_exit y de los detalles para usted, para que no tenga que preocuparse por ello.

Si está implementando un mecanismo de supervisión, que es probablemente de lo que trata el screen-cast (no lo ha visto), tendrá que encargarse de la operación trap_exit.

+0

respuesta increíble. –