Pregunta

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

Toma el problema del productor-consumidor. Con hilos puedo bloquear a los productores cuando el búfer se llena. Vi un par de ejemplos de productores y consumidores escritos en Scala y todos ellos usan actores con buzones de correo 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 los buzones de correo?

¿Fue útil?

Solución

Puede crear un actor que actúe como un búfer entre el productor y el consumidor. El búfer comprueba su buzón a sus datos de bucle. Envía una " sobrecarga " mensaje al productor cuando el número de productos almacenados es demasiado alto; y envía un " borrar " mensaje una vez que todo está de nuevo en orden. En caso de que haya demasiados mensajes, simplemente elimina los mensajes entrantes (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 una " sobrecarga " mensaje que puede detener la producción, o puede continuar produciendo, sabiendo que los productos podrían caerse.

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

Otros consejos

El método Actor.mailboxSize devuelve el número de mensajes pendientes en el buzón del Actor.

Esto se puede usar para acelerar el productor de varias maneras.

Por ejemplo, una posibilidad podría ser,

El productor verifica si el tamaño del buzón del consumidor es mayor que algún umbral. Si es así, envía un SpecialMessage al consumidor y lo bloquea en un semáforo. Cuando el consumidor recibe este SpecialMessage , libera el semáforo. El productor ahora puede continuar alegremente su negocio.

Esto evita el sondeo, así como cualquier mensaje caído.

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