En mi proyecto estoy construyendo un marco de ejecución Java que recibe solicitudes de trabajo de un cliente. El trabajo (tamaño variable) se divide en un conjunto de tareas y luego se pone en cola para su procesamiento. Hay colas separadas para procesar cada tipo de tarea y cada cola está asociada a un ThreadPool. Los ThreadPools están configurados de forma tal que el rendimiento general del motor es óptimo.Trabajo/Tarea Robo ThreadPoolExecutor
Este diseño nos ayuda a balancear las solicitudes de manera efectiva y las grandes solicitudes no terminan acaparando los recursos del sistema. Sin embargo, a veces la solución se vuelve ineficaz cuando algunas de las colas están vacías y sus respectivos grupos de subprocesos permanecen inactivos.
Para hacerlo mejor, estaba pensando en implementar una técnica de robo de trabajo/tarea para que la cola con mucha carga pueda obtener ayuda de los otros ThreadPools. Sin embargo, esto puede requerir la implementación de mi propio ejecutor, ya que Java no permite asociar múltiples colas con un ThreadPool y no admite el concepto de robo de trabajo.
Lea acerca de Fork/Join, pero eso no parece ajustarse a mis necesidades. Cualquier sugerencia o forma alternativa de construir esta solución podría ser muy útil.
Gracias Andy
Debería pensar en cómo mantener todas sus CPU ocupadas. No importa si alguno de sus subprocesos está inactivo si está haciendo el mejor uso posible de sus CPU. –
Si los grupos de subprocesos tienen tantos subprocesos como usted tiene cpus, cualquier grupo de subprocesos individual puede "robar" toda la copia incluso si todos los demás grupos de subprocesos están inactivos. –
@PeterLawrey: eso es cierto, pero si hay muchas agrupaciones, puede tener un rendimiento bajo si todos los subprocesos de todas las agrupaciones funcionan al mismo tiempo. – jtahlborn