Pregunta

Me he dado cuenta de dos métodos de "paso de mensajes". Uno que he visto el uso de Erlang y el otro es de Stackless Python. Por lo que entiendo aquí está la diferencia

Erlang Estilo - Los mensajes se envían y se pone en cola en el buzón del proceso de recepción. A partir de ahí se eliminan en una base FIFO. Una vez que el primer proceso envía el mensaje de que es libre para continuar.

Estilo de Python - colas de procesar una para enviar a procesar B. B está realizando actualmente alguna otra acción, por lo que A es congelado hasta que B está listo para recibir. Una vez que se abre un canal B de lectura, A envía los datos, entonces ambos continúan.

Ahora veo las ventajas del método Erlang es que usted no tiene ningún procesos bloqueados. Si B no es capaz de recibir, A todavía puede continuar. Sin embargo, he notado en algunos programas que he escrito, que es posible que los cuadros de mensaje Erlang para conseguir llena de cientos (o miles) de mensajes desde la entrada de mensajes es mayor que el flujo de salida.

Ahora no he escrito un programa con múltiples contactos en el marco / idioma Así que me pregunto sus experiencias son con esto, y si es algo que Tendría que preocuparse.

Sí, sé que esto es abstracto, pero también estoy en busca de respuestas bastante abstractos.

¿Fue útil?

Solución

Mi experiencia en programación Erlang es que cuando se espera una alta tasa de mensajería (es decir, un productor más rápido que los consumidores), entonces usted añada su propio control de flujo. Un escenario simple

  • El consumidor será: enviar el mensaje, espere ACK, y luego repetir.
  • El productor: esperar a que el mensaje, envía una notificación cuando el mensaje recibido y procesado, y luego repetir
  • .

También se puede invertirlo, de las esperas de productores para que el consumidor van y agarran los N próximos mensajes disponibles.

Estos enfoques y otra de control de flujo se pueden ocultar detrás de las funciones, la primera de ellas es en su mayoría ya están disponibles en gen_server:call/2,3 en contra de un proceso de comportamiento OTP gen_server.

Veo mensajería asíncrona como en Erlang como el mejor enfoque, ya que cuando las latencias son altos es posible que mucho quiere evitar una sincronización cuando la mensajería entre los ordenadores. Entonces se puede componer formas inteligentes para implementar el control de flujo. Decir, lo que requiere un acuse de recibo por parte del consumidor por cada N mensajes al productor han enviado, o enviar un mensaje de "ping a mí cuando haya recibido éste" especial de vez en cuando, a contar el tiempo de ping.

Otros consejos

En términos generales, se trata de colas sin límites vs colas delimitadas. Un canal sin pérdida de velocidad puede considerarse un caso especial de una cola con 0 tamaño.

colas acotados tienen una tendencia a un punto muerto. Dos hilos / procesos que intenta enviar un mensaje a uno del otro, ambos con una cola llena.

colas no acotadas tienen más sutil fracaso. Una caja grande no cumplirá con los requisitos de latencia, como usted ha mencionado. Va lo suficientemente lejos y con el tiempo se desborde; hay tal cosa como la memoria infinita, por lo que no deja de ser una cola acotada con un límite grande que anula el proceso cuando está llena.

¿Cuál es el mejor? Eso es difícil de decir. No hay respuestas fáciles aquí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top