Compruebe los documentos en su JVM para ver si admite subprocesamiento múltiple. Estoy bastante seguro de que los rayos del sol sí. Java Concurrency In Practice es el lugar para comenzar a realizar subprocesos múltiples.
La primera parte de su pregunta es: ¿es el multiprocesamiento superior al multihilo, desde una perspectiva de rendimiento? En un sistema con soporte robusto de subprocesos múltiples, los subprocesos siempre deben ser superiores a los procesos, desde una perspectiva de rendimiento. Hay más aislamiento entre subprocesos (sin memoria compartida, a menos que se configure explícitamente a través de un mecanismo de IPC), por lo que es posible que desee ir por la ruta de multiproceso para evitar que los subprocesos peligrosos se pisen entre sí.
Para el procesamiento de datos, los hilos deben ser la mejor manera de proceder. Si los hilos en su máquina local no son suficientes, omitiría una solución multiproceso e iría directamente a un sistema map-reduce como Hadoop.
En cuanto a por qué las aplicaciones multiproceso son mencionado, creo que el autor quiere estar completo. Aunque no se proporciona un tutorial, es un enlace a la documentación adicional. La gran desventaja de usar multiprocesamiento es que debe lidiar con la comunicación entre procesos. A diferencia de los hilos, no puedes simplemente compartir algo de memoria y lanzar algunos mutex alrededor y llamarlo un día.
Según los comentarios, parece que hay cierta confusión acerca de qué es realmente el "multiprocesamiento". Los hilos son construcciones que deben ser creadas por su código. Hay API para la creación y administración de subprocesos. Los procesos, sin embargo, se pueden crear a mano en la línea de comando. En un cuadro Unix, haga lo siguiente para ejecutar cuatro instancias (procesos) de foo
. Tenga en cuenta que se requiere el &
final.
$ ./foo & ./foo & ./foo & ./foo &
Ahora bien, si usted tiene un archivo de entrada, bar
que foo necesita procesar, usar algo como split
a dividirla en cuatro segmentos iguales, y ejecutar foo
en él:
$ ./foo bar.0 > bar.0.out & ./foo bar.1 > bar.1.out & ./foo bar.2 > bar.2.out & ./foo bar.3 > bar.3.out &
Por último, Deberá combinar los archivos bar.?.out
. Hacer una prueba como esta debería darle una idea de si el uso de procesos pesados es una buena idea para su aplicación.Si ya ha creado una aplicación multiproceso, probablemente esté bien. Pero puede ejecutar algunos experimentos para ver si los procesos funcionan mejor. Una vez que esté seguro de que los procesos son el camino a seguir, reorganice su código para usar ProcessBuilder para acelerar los procesos usted mismo.
¿Está obligado CPU o E/S de la envolvente? Los discos duros son significativamente más lentos que los procesadores. Además, los subprocesos generalmente son más livianos para alternar entre y compartir datos entre los procesos. Si su programa está esperando constantemente el disco, no va a importar mucho de ninguna manera. –
Tengo una cola de docenas de archivos csv para importar en mi aplicación java. Utilizo un conjunto de hilos (siete hilos, precisamente) para importarlos más rápido que uno después del otro - en este momento puedo importar 7 archivos csv "a la vez" - uno por hilo. ¿Podría acelerar esto aún más con multiprocesamiento? ¿Cómo es el multiprocesamiento útil para el paralelismo en una sola computadora en general? – seinecle
Por lo general, me parece que puede mejorar el rendimiento de un solo hilo mucho más que el solo 4x (lo mejor que puede esperar de 4 núcleos si está vinculado a la CPU) Me aseguraría de haber perfilado y optimizado completamente el código que tiene primero . –