parallel - Programación paralela en Java
java await (17)
¿Es Ateji PX parallel-for loop lo que estás buscando? Esto rastreará todos los sitios en paralelo (observe la barra doble al lado de la palabra clave for):
for||(Site site : sites) {
crawl(site);
}
Si necesita redactar los resultados del rastreo, probablemente le interese usar una comprensión paralela, como por ejemplo:
Set result = set for||{ crawl(site) | Site site : sites }
Leyendo más aquí: http://www.ateji.com/px/whitepapers/Ateji%20PX%20for%20Java%20v1.0.pdf
¿Cómo podemos hacer programación paralela en Java? ¿Hay algún marco especial para eso? ¿Cómo podemos hacer que las cosas funcionen?
Les diré lo que necesito, creo que estoy desarrollado un rastreador web, su gran cantidad de sitio web de Internet, un sistema de rastreo no hará que las cosas funcionen correctamente, por lo que necesitamos 1000 de sistema para funcionar, si esto es así. el caso, ¿puedo aplicar la computación paralela? ¿Pueden darme un buen ejemplo?
Desea ver el Marco de Procesamiento Paralelo de Java ( JPPF )
En Java, el procesamiento paralelo se realiza mediante hilos que forman parte de la biblioteca de tiempo de ejecución
El tutorial de concurrencia debe responder muchas preguntas sobre este tema si es nuevo en Java y en programación paralela.
Es posible que desee ver Hadoop. Está diseñado para tener trabajos que se ejecutan en una cantidad arbitraria de casillas y se encarga de toda la contabilidad para usted. Está inspirado en MapReduce de Google y sus herramientas relacionadas, por lo que incluso proviene de la indexación web.
Este es el recurso de programación paralelo al que me han señalado en el pasado:
No tengo idea si es bueno o no, solo que alguien lo recomendó hace un tiempo.
Hasta donde yo sé, en la mayoría de los sistemas operativos, el mecanismo de enhebrado de Java debe basarse en hilos reales del kernel. Esto es bueno desde la perspectiva de programación paralela. Otros lenguajes como Python simplemente hacen un poco de multiplexación de tiempo del procesador (es decir, si ejecuta una aplicación multiproceso pesada en una máquina multiprocesador, verá solo un procesador ejecutándose).
Puede encontrar fácilmente algo buscando en Google: por ejemplo, este es el primer resultado de "java threading": http://download-llnw.oracle.com/javase/tutorial/essential/concurrency/
Básicamente se reduce para extender la clase Thread, sobrecargar el método "run" con el código que pertenece a la otra cadena y llamar al método "start" en una instancia de la clase que extendió.
Además, si necesita hacer algo seguro con subprocesos, eche un vistazo a los métodos sincronizados .
He oído hablar de uno en una conferencia hace unos años: ParJava . Pero no estoy seguro del estado actual del proyecto.
Java admite subprocesos, por lo que puede tener una aplicación Java de subprocesos múltiples. Recomiendo encarecidamente el libro Programación concurrente en Java: Principios y patrones de diseño para eso:
Lea la sección ón hilos en el tutorial de Java. http://download-llnw.oracle.com/javase/tutorial/essential/concurrency/procthread.html
paquete java.util.concurrency y el libro de Brian Goetz "concurrencia Java en la práctica"
También hay muchos recursos aquí sobre patrones paralelos por Ralph Johnson (uno de los autores de patrones de diseño de GoF): http://parlab.eecs.berkeley.edu/wiki/patterns/patterns
Si está preguntando acerca de la programación paralela pura , es decir, no de la programación simultánea , entonces definitivamente debe probar MPJExpress http://mpj-express.org/ . Es una implementación de mpiJava segura para subprocesos y admite modelos de memoria distribuida y compartida. Lo probé y encontré muy confiable.
1 import mpi.*;
2
3
/**
4 * Compile:impl specific.
5 * Execute:impl specific.
6 */
7
8 public class Send {
9
10 public static void main(String[] args) throws Exception {
11
12 MPI.Init(args);
13
14 int rank = MPI.COMM_WORLD.Rank() ; //The current process.
15 int size = MPI.COMM_WORLD.Size() ; //Total number of processes
16 int peer ;
17
18 int buffer [] = new int[10];
19 int len = 1 ;
20 int dataToBeSent = 99 ;
21 int tag = 100 ;
22
23 if(rank == 0) {
24
25 buffer[0] = dataToBeSent ;
26 peer = 1 ;
27 MPI.COMM_WORLD.Send(buffer, 0, len, MPI.INT, peer, tag) ;
28 System.out.println("process <"+rank+"> sent a msg to "+ 29 "process <"+peer+">") ;
30
31 } else if(rank == 1) {
32
33 peer = 0 ;
34 Status status = MPI.COMM_WORLD.Recv(buffer, 0, buffer.length, 35 MPI.INT, peer, tag);
36 System.out.println("process <"+rank+"> recv''ed a msg/n"+ 37 "/tdata <"+buffer[0] +"> /n"+ 38 "/tsource <"+status.source+"> /n"+ 39 "/ttag <"+status.tag +"> /n"+ 40 "/tcount <"+status.count +">") ;
41
42 }
43
44 MPI.Finalize();
45
46 }
47
48 }
Una de las funcionalidades más comunes que proporcionan las bibliotecas de mensajería como MPJ Express es el soporte de la comunicación punto a punto entre procesos de ejecución. En este contexto, dos procesos que pertenecen al mismo comunicador (por ejemplo, el comunicador MPI.COMM_WORLD) pueden comunicarse entre sí enviando y recibiendo mensajes. Una variante del método Send () se utiliza para enviar el mensaje desde el proceso del remitente. Por otro lado, el proceso de recepción recibe el mensaje enviado utilizando una variante del método Recv (). Tanto el emisor como el receptor especifican una etiqueta que se utiliza para encontrar un mensaje entrante coincidente en el lado del receptor.
Después de inicializar la biblioteca de MPJ Express utilizando el método MPI.Init (args) en la línea 12, el programa obtiene su rango y el tamaño del comunicador MPI.COMM_WORLD. Ambos procesos inicializan una matriz de enteros de longitud 10 llamada buffer en la línea 18. El sendero de proceso-rank 0-almacena un valor de 10 en el primer elemento de la matriz de mensajes. Una variante del método Send () se usa para enviar un elemento de la matriz de mensajes al proceso del receptor.
El proceso del remitente llama al método Send () en la línea 27. Los primeros tres argumentos están relacionados con los datos que se envían. La matriz emisora -la matriz más grande- es el primer argumento seguido por 0 (o! Set) y 1 (conteo). Los datos que se envían son del tipo MPI.INT y el destino es 1 (variable par); el tipo de datos y el destino se especi fi can como cuarto y quinto argumento del método Send (). El último y el sexto argumento es la variable de etiqueta. Una etiqueta se usa para identificar mensajes en el lado del receptor. Una etiqueta de mensaje suele ser un identificador de un mensaje particular en un comunicador específico. Por otro lado, el proceso de recepción (rango 1) recibe el mensaje utilizando el método de recepción de bloqueo.
Puedes echar un vistazo a Hadoop y Hadoop Wiki . Este es un marco apache inspirado en map-reduce de Google. Te permite hacer computación distribuida usando múltiples sistemas. Muchas compañías como Yahoo, Twitter lo usan ( Sites Powered By Hadoop ) .Ver este libro para obtener más información sobre cómo usarlo Hadoop Book .
¿Has mirado esto?
http://www.javacodegeeks.com/2013/02/java-7-forkjoin-framework-example.html?ModPagespeed=noscript
¿El marco de Fork / Join?
También estoy tratando de aprender un poco sobre esto.
puede usar JCSP ( http://www.cs.kent.ac.uk/projects/ofa/jcsp/ ) la biblioteca implementa los principios de CSP (comunicación de procesos secuenciales) en Java, la paralelización se abstrae del nivel de subprocesos y en su lugar se ocupa de procesos.
Java SE 5 y 6 introdujeron un conjunto de paquetes en java.util.concurrent. * Que proporcionan bloques de creación de concurrencia potentes. mira esto para más información. http://www.oracle.com/technetwork/articles/java/fork-join-422606.html
Puede probar Parallel Java 2 Library .
En el sitio web, el Prof. Alan Kaminsky escribió:
Avancemos hasta 2013, cuando comencé a desarrollar PJ2. La informática paralela se expandió mucho más de lo que era una década antes. Las computadoras paralelas de múltiples núcleos estaban equipadas con muchos más núcleos de CPU y una memoria principal mucho más grande, de modo que los cómputos que solían requerir un clúster completo ahora se podían hacer en un solo nodo multinúcleo. Los nuevos tipos de hardware de cómputo paralelo se habían vuelto comunes, especialmente los aceleradores de la unidad de procesamiento de gráficos (GPU). Los servicios de computación en la nube, como el EC2 de Amazon, permitieron que cualquiera ejecutara programas paralelos en una supercomputadora virtual con miles de núcleos. Se han abierto nuevas áreas de aplicación para la informática paralela, en particular el análisis de big data. Surgieron nuevas API de programación paralela, como OpenCL y CUDA de NVIDIA Corporation para programación en paralelo GPU, y marcos de reducción de mapa como Hadoop de Apache para informática de big data. Para explorar y aprovechar todas estas tendencias, decidí que se necesitaba una biblioteca Parallel Java 2 completamente nueva.
A principios de 2013, cuando todavía no estaba disponible PJ2
(aunque era una versión anterior), probé Java Parallel Processing Framework
(JPPF). JPPF estaba bien, pero a primera vista PJ2
parece interesante.
Hay una biblioteca llamada Habanero-Java (HJ), desarrollada en Rice University que se construyó utilizando expresiones lambda y puede ejecutarse en cualquier JVM Java 8.
HJ-lib integra una amplia gama de construcciones de programación paralelas (por ejemplo, tareas asincrónicas, futuros, tareas basadas en datos, por ejemplo, barreras, sincronizadores, transacciones, actores) en un único modelo de programación que permite combinaciones únicas de estos constructos (por ejemplo, anidados combinaciones de paralelismo de tarea y actor).
El tiempo de ejecución de HJ es responsable de orquestar la creación, ejecución y terminación de las tareas de HJ, y presenta tanto planificadores de trabajo compartido como de robo de trabajo. Puede seguir el tutorial para configurarlo en su computadora.
Aquí hay un ejemplo simple de HelloWorld:
import static edu.rice.hj.Module1.*;
public class HelloWorld {
public static void main(final String[] args) {
launchHabaneroApp(() -> {
finish(() -> {
async(() -> System.out.println("Hello World - 1!"));
async(() -> System.out.println("Hello World - 2!"));
async(() -> System.out.println("Hello World - 3!"));
async(() -> System.out.println("Hello World - 4!"));
});
});
}}
Cada método async se ejecuta en paralelo con los otros métodos asíncronos , mientras que el contenido dentro de estos métodos se ejecuta secuencialmente. El programa no continúa hasta que se complete todo el código dentro del método de finalización.