Pregunta

Considere la posibilidad de una gran tarea que podría dividirse en cientos de pequeños, de forma independiente-tareas ejecutables.Para ser más específicos, cada pequeña tarea es enviar un poquito de solicitud de red y decidir sobre la respuesta recibida desde el servidor.Estas pequeñas tareas que no se espera que tome más de un segundo, y que involucran a un par de servidores en total.

Tengo en mente dos enfoques para implementar esta usando el Ejecutor marco, y quiero saber cual es mejor y por qué.

  1. Crear un par de, digamos 5 a 10 tareas de cada participación haciendo un montón de enviar y recibe.
  2. Crear una sola tarea (puede llamar o Ejecutable) para cada envío y recepción y programación de todos ellos (cientos) a ser ejecutado por el ejecutor.

Lo siento si mi pregunta muestra que estoy perezoso a prueba y ver por mí mismo lo que es mejor (al menos en cuanto al rendimiento).Mi pregunta, cuidando de una respuesta a este caso en específico, tiene un aspecto más general.En situaciones como estas, cuando se desea utilizar un ejecutor para hacer toda la programación y otras cosas, es mejor crear un montón de pequeñas tareas o para agrupar a aquellos en un menor número de grandes tareas?

¿Fue útil?

Solución

es mejor crear un montón de pequeñas tareas o para agrupar a aquellos en un menor número de grandes tareas?

Es difícil generalizar con una pregunta como esta, pero en tu caso, creo que no tiene sentido crear algunas de las tareas que cada uno hace de 5 a 10 cosas y, a continuación, enviar eso a un ejecutor de servicio.

Yo diría que todo el trabajo como un grupo de individuos, pequeñas tareas a la ExecutorService.Creo que esto sería hacer las tareas mucho más limpio de un objeto/código de perspectiva.Ellos no tienen que tener una colección de las peticiones/respuestas y puede concentrarse en hacer una sola solicitud y procesamiento de una respuesta.

Una excepción a esto sería si lo que quiere es no enviar peticiones a un servidor en particular.Entonces tendría sentido tiene una tarea que hacer todas las peticiones/respuestas de un servidor en particular, y a presentar una tarea para cada servidor.

Otros consejos

En general, diría que las tareas más pequeñas son mejores, ya que son como módulos y se pueden combinar en la moda deseada, incluso si los requisitos cambian.

Sin embargo, si solo pueden ejecutarse como un trozo, usted tiene una mejor visión general con una gran tarea.

El rendimiento, por supuesto, también es un problema.Pero esto depende en gran medida del número de CPU de su servidor / máquina y la carga de todo el sistema.Incluso si lo sabíamos, qué está haciendo exactamente lo que está haciendo, debe probarlo para determinar, lo que es más eficiente.Pero tenga en cuenta que, la inicialización y la gestión de las tareas también toman algún tiempo y, si sus acciones son realmente pequeñas, puede invertir más tiempo en la gestión de tareas que en la ejecución real.

Ejecutar todas las tareas (pequeñas) en paralelo también puede resultar difícil para el servidor de contestador, que necesita procesar las solicitudes.Tenga en cuenta que los servicios web o por lo general también tienen un límite de cuántas solicitudes paralelas pueden servir.

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