2010-03-17 15 views
5

Lectura (lo suficientemente descremada para obtener la codificación) a través de Erlang Programming y Programming Erlang.Orden de tiempo de los mensajes

Una pregunta, que es tan simple como suena:

Si usted tiene un proceso Pid1 en la máquina m1 y mil millones de millones de mensajes se envían a Pid1, son mensajes manejados en paralelo por ese proceso (recibo la impresión no) y (contestado abajo)

¿hay alguna garantía de orden al procesar los mensajes? es decir. Recibido en orden enviado? Si es así, ¿cómo se maneja el sesgo del reloj en situaciones de alto tráfico para realizar un pedido?

Viniendo de todo el fondo de C/Thread pools/Shared State ... Quiero obtener este concreto. Entiendo la distribución de una aplicación, pero quiero asegurarme de que los 'huesos en bruto' sean los que espero antes de crear procesos y distribuir la carga de trabajo.

Además, estoy en lo cierto al pensar el mundo entero es que chasquea la actualidad a través de textos Erlang;)

Respuesta

10

Si el proceso A envía dos mensajes al proceso B, se garantiza que los dos mensajes llegarán en el orden en que se enviaron.

Si el proceso A envía un mensaje al proceso B y luego un mensaje para procesar C, no hay garantía en cuanto al orden en que se reciben.

Del mismo modo, si los procesos A & B envían mensajes a C, no hay garantía en cuanto al orden en que se reciben los mensajes.

Es una propiedad fundamental del modelo de paso de mensajes, el orden de los cálculos en los diferentes procesos no está definido, solo puede hablar de forma significativa sobre el envío de mensajes. Una consecuencia de las reglas anteriores es que si A envía un mensaje a C, luego un mensaje a B, y al recibir el mensaje B envía a C, entonces C puede recibir los dos mensajes en cualquier orden.(En la práctica, sospecho que esto nunca se revierte en un solo nodo, pero podría suceder fácilmente si los tres procesos están en nodos diferentes).

+0

+1, una buena respuesta sólida. Mi pensamiento sobre el paso de mensajes es mucho más claro ahora que si A y B envían muchos mensajes a C, entonces ningún orden (de la unión de los mensajes A y B) es concreto. Algo para tener en cuenta en la "colocación de preocupaciones" en el diseño, creo. –

+0

Joe Armstrong hace una analogía (http://armstrongonsoftware.blogspot.com/2006/08/concurrency-is-easy.html) que me gusta mucho. Las garantías de pedido que obtienes son exactamente las mismas que con un grupo de personas que se hablan entre sí. – cthulahoops

+0

¡Gran enlace, gracias! –

2

Los mensajes no se manejan en paralelo; es solo un proceso, después de todo.

En cuanto al orden de mensajes: la cola de mensajes se escanea en "orden de tiempo" (de más antigua a más reciente). I think Recuerdo una discusión de la lista de correo hace mucho tiempo en la que alguien aclaró que la marca de tiempo es la originación de los mensajes (es decir, el momento en que se envió), pero no puedo recordar con claridad y puedo No encuentra ninguna referencia a eso en línea.

Tenga en cuenta que su declaración receive puede realizar la coincidencia en el encabezado de la cola de mensajes entrantes, lo que, por supuesto, permitiría a un receptor seleccionar los mensajes entrantes fuera del orden (temporal).

+0

+1, gracias Pointy. Mantener las pestañas en orden de tiempo es una opción. Supongo que el orden absoluto es casi imposible. ¡Buena respuesta! Mis mensajes vendrán con una respuesta al proceso de origen. Aún así, ¿Erlang sincroniza los relojes? –

1

por la erlang reference manual:

[Recieve] recibe los mensajes enviados al proceso utilizando el operador de envío (!). El patrón de patrones es secuencialmente con el primer mensaje en orden de tiempo en el buzón, luego el en segundo lugar, y así sucesivamente.

Los mensajes se procesan en serie por proceso.

+0

+1, ah ahí está: P ¿Qué pasa si la marca de tiempo es "hora de envío" y los relojes de los nodos tienen sesgo; En un entorno de alto tráfico, importa, ¿las VM/libs de Erlang lo tienen en cuenta? –

Cuestiones relacionadas