2009-10-24 23 views
15

¿Puedo establecer el tamaño máximo para el buzón de un actor en Scala?límite de tamaño de buzón de scala

Tome el problema Productor-Consumidor. Con los hilos puedo bloquear a los productores cuando el buffer se llena. Vi un par de ejemplos de productor-consumidor escritos en Scala y todos usan actores con buzones usados ​​como "buffer". ¿Puedo configurar el tamaño del buzón para que los productores esperen hasta que el consumidor esté listo? ¿Alguna otra solución elegante para evitar el crecimiento incontrolable de buzones?

Respuesta

16

Puede crear un actor que actúe como un búfer entre el productor y el consumidor. El búfer verifica su buzón a sus datos de bucle. Envía un mensaje de "sobrecarga" al productor cuando la cantidad de productos almacenados es demasiado alta; y envía un mensaje "claro" una vez que todo vuelve a estar en orden. En caso de demasiados mensajes, simplemente descarta los que llegan (o los más antiguos).

El consumidor solicita activamente productos del búfer, que a su vez devuelve un producto. Si el búfer está vacío, el consumidor sigue esperando la entrada.

El productor envía productos al actor de búfer. Si recibe un mensaje de "sobrecarga", puede detener la producción, o puede seguir produciendo, sabiendo que los productos podrían descartarse.

Por supuesto, esta lógica podría implementarse directamente en el productor o consumidor mismo, pero un búfer independiente le permitirá introducir más productores y/o consumidores con mayor facilidad.

5

El método Actor.mailboxSize devuelve la cantidad de mensajes pendientes en el buzón del actor.

Esto se puede utilizar para estrangular al productor de varias maneras.

Por ejemplo, una posibilidad podría ser,

Los controles de productores si del consumidor mailboxSize es mayor que algún umbral. Si es así, envía un SpecialMessage al consumidor y bloques en un semáforo. Cuando el consumidor recibe este SpecialMessage, libera el semáforo. El productor ahora puede seguir alegremente sus negocios.

Esto evita el sondeo y cualquier mensaje que se caiga.

+1

El sondeo me parece más apropiado que hacer que el buzón del consumidor sea un "estado compartido" entre dos actores. – Zed

+1

El sondeo a menudo es mejor desde una perspectiva puramente de programación, pero los semáforos a menudo son mejores desde la perspectiva de la utilización del hardware. Depende de su situación exacta en cuanto a qué se debe seleccionar. –

+0

@Zed ¡El buzón del consumidor ES estado compartido! De lo contrario, el productor no podría enviarle ningún mensaje :) – HRJ

Cuestiones relacionadas