2012-09-19 20 views
5

Dados dos nodos Erlang, "foo @ host" y "barra @ host", la siguiente produce una impresión de "foo":Los nodos remotos, líderes de grupos e impresiones

([email protected]) rpc:call('[email protected]', io, format, ["~p", [test]]). 

Aunque las siguientes impresiones a cabo en "bar":

([email protected]) rpc:call('[email protected]', erlang, display, [test]). 

Incluso si erlang:display/1 se supone que se utilizará para la depuración solamente, se supone que ambas funciones para enviar cosas a la salida estándar. Cada proceso debe heredar al líder del grupo de su padre, por lo que esperaría que las dos funciones se comporten de manera consistente.

¿Hay alguna justificación para el comportamiento anterior?

Respuesta

12

La razón de esta diferencia de comportamiento es donde y por quién se hace la salida:

  • erlang:display/1 es una BIF y se realiza directamente por el haz que escribe de ella hacia fuera a su salida estándar sin ir a ninguna parte cerca de io-sistema de Erlang. De esta manera, al hacer esto en bar, se imprime en la salida estándar de bar.

  • io:format/1/2 es manejado por Erlang io-system. Como no se ha proporcionado IoDevice, envía una io-solicitud a su líder de grupo. El rpc:call/4 se implementa de tal manera que el proceso generado remotamente hereda al líder del grupo del proceso que realiza la llamada RPC. Por lo tanto, la salida va a la salida estándar del proceso de llamada. Por lo tanto, al hacer una llamada RPC en foo al nodo bar, la salida pasa a foo.

De ahí la diferencia. Es interesante notar que no se necesita un manejo especial de esto en el sistema Erlang io, una vez que el líder del grupo ha establecido que todo funciona de manera transparente.

+0

Explicación brillante. Gracias. –

+0

Sí, esta es también la razón por la que erlang: display/1 es excelente para demostrar cómo funciona Erlang I/O. Su ejemplo exacto usando rpc en un nodo remoto con pantalla o formato es algo que he usado en sesiones de entrenamiento. :-) – RichardC

+0

@RichardC ¿Quiere decir la diferencia entre escribir directamente a stdout y usar Erlang io? – rvirding

Cuestiones relacionadas