2011-12-09 16 views
9

Estoy ejecutando un programa de ensamblaje de genoma * Trinity, http://trinityrnaseq.sourceforge.net/, si está interesado) en uno de los recursos XSEDE. El hardware limita el número de subprocesos a 2500, que el programa siempre desea exceder ... ¿Existe una manera fácil de limitar el número de subprocesos ejecutados? He intentado -XX:ParallelGCThreads=16, pero esto parece introducir nuevos errores.En tiempo de ejecución, ¿cómo puedo limitar el número de subprocesos java

Entonces, ¿hay un comando de tiempo de ejecución para limitar el número total de hilos?

+4

El problema es que, incluso si pudiera decirle a la JVM que limite el número de subprocesos, la lógica de la aplicación Trinity aún trataría de obtener más subprocesos y, por lo tanto, fallaría (o bloquearía) en el tiempo de ejecución. Parece que realmente quieres parchar la base del código de Trinity para usar una estrategia diferente de bifurcación/creación de hilo, y eso requeriría obtener su fuente y cambiarla. –

+0

Revisé los documentos de Trinity y vi una opción --CPU. ¿Has probado eso? – user949300

+0

Revisé los documentos de Trinity y vi una opción --CPU. ¿Has probado eso? – user949300

Respuesta

0

Puede usar una cola personalizada que se ejecuta como un proceso separado que maneja la cantidad de limitaciones de subprocesos. La ventaja de esto es que puede optar por limitar los hilos o aún puede seguir agregando el número de hilos. Probablemente tengas una clase addToQueue(Thread t) y, posteriormente, un consumidor que consuma todos estos hilos. La cola sabrá cuántos hilos se están ejecutando activamente. El proceso del daemon activará el método consume() de esta cola a voluntad si los hilos están dentro del rango. Y después de que cada hilo termina o lo obliga a un trabajo, informa a la cola. La cola que mantiene puede ser una cola de prioridad si considera que debe haber una prioridad en las tareas en ejecución. Esto no solo elimina la dependencia de la JVM, sino que también hace que su programa se vea más limpio.

2

Use un Executor o ExecutorService. Hace lo que sugiere Bragboy, pero está integrado en Java.

Cuestiones relacionadas