Comment pouvons-nous faire de la programmation parallèle en Java? Y a-t-il un cadre spécial pour cela? Comment pouvons-nous faire les choses fonctionnent?
Je vais vous dire, les gars, ce dont j'ai besoin, je pense avoir développé un robot d'exploration du Web, son crawl de sites Web à partir d'Internet, une analyse de système ne fonctionnera pas correctement. le cas, puis-je appliquer l'informatique parallèle? Pouvez-vous me donner un exemple approprié?
Si vous vous interrogez sur la programmation pure parallèle, c'est-à-dire non concurrente, vous devez absolument essayer MPJExpress http://mpj-express.org/ . Il s'agit d'une implémentation thread-safe de mpiJava qui prend en charge les modèles de mémoire distribuée et partagée. Je l'ai essayé et trouvé très fiable.
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 }
L'une des fonctionnalités les plus courantes des bibliothèques de messagerie telles que MPJ Express est la prise en charge de la communication point à point entre les processus en cours d'exécution. Dans ce contexte, deux processus appartenant au même communicateur (par exemple, le communicateur MPI.COMM_WORLD) peuvent communiquer l'un avec l'autre en envoyant et en recevant des messages. Une variante de la méthode Send () est utilisée pour envoyer le message à partir du processus expéditeur. D'autre part, le message envoyé est reçu par le processus récepteur en utilisant une variante de la méthode Recv (). L'expéditeur et le destinataire spécifient tous les deux une balise utilisée pour rechercher les messages entrants correspondants du côté du destinataire.
Après avoir initialisé la bibliothèque MPJ Express à l'aide de la méthode MPI.Init (args) à la ligne 12, le programme obtient son rang et la taille du communicateur MPI.COMM_WORLD. Les deux processus initialisent un tableau entier de longueur 10 appelé tampon sur la ligne 18. Le processus émetteur - rang 0 - enregistre une valeur de 10 dans le premier élément du tableau msg. Une variante de la méthode Send () est utilisée pour envoyer un élément du tableau msg au processus récepteur.
Le processus expéditeur appelle la méthode Send () à la ligne 27. Les trois premiers arguments sont liés aux données envoyées. Le tampon d'envoi est le premier argument, suivi de 0 (o! Set) et 1 (count). Les données envoyées sont de type MPI.INT et la destination est 1 (variable homologue); le type de données et la destination sont spécifiés comme quatrième et cinquième arguments de la méthode Send (). Le dernier et le sixième argument est la variable tag. Une balise est utilisée pour identifier les messages du côté du destinataire. Une étiquette de message est généralement un identificateur d'un message particulier dans un communicateur spécifique ... Par contre, le processus récepteur (rang 1) reçoit le message en utilisant le procédé de réception par blocage.
Java supporte les threads, vous pouvez donc avoir une application Java multi-threadée. Je recommande fortement le livre Concurrent Programming in Java: Design Principles and Patterns pour cela:
Vous voulez regarder le Java Parallel Processing Framework ( JPPF )
Vous pouvez consulter Hadoop et Hadoop Wiki . Il s'agit d'un framework Apache inspiré de google's map-reduce.Il vous permet de faire de l'informatique distribuée à l'aide de plusieurs systèmes.Beaucoup de sociétés comme Yahoo, Twitter ( Sites Powered By Hadoop ). Consultez ce livre pour plus d’informations sur son utilisation Hadoop Book .
Voici la ressource de programmation parallèle sur laquelle j'ai déjà fait allusion:
Je ne sais pas si c'est bon ou pas, c'est simplement que quelqu'un l'a recommandé il y a quelque temps.
La boucle parallèle-for Ateji PX correspond-elle à ce que vous recherchez? Tous les sites seront analysés en parallèle (remarquez la double barre située en regard du mot clé for):
for||(Site site : sites) {
crawl(site);
}
Si vous devez composer les résultats de l'exploration, vous voudrez probablement utiliser une compréhension parallèle, telle que:
Set result = set for||{ crawl(site) | Site site : sites }
Plus de lecture ici: http://www.ateji.com/px/whitepapers/Ateji%20PX%20for%20Java%20v1.0.pdf
En Java, le traitement parallèle est effectué à l'aide de threads faisant partie de la bibliothèque d'exécution.
Le Tutoriel de concurrence devrait répondre à de nombreuses questions sur ce sujet si vous débutez en programmation Java et parallèle.
J'en ai entendu parler à la conférence il y a quelques années - ParJava . Mais je ne suis pas sûr de l'état actuel du projet.
Autant que je sache, sur la plupart des systèmes d'exploitation, le mécanisme Threading de Java devrait être basé sur de vrais threads du noyau. C'est bien de la perspective de la programmation parallèle. D'autres langages, tels que Python, effectuent simplement un certain multiplexage temporel du processeur (à savoir, si vous exécutez une application multithread lourde sur une machine multiprocesseur, un seul processeur est en cours d'exécution).
Vous pouvez facilement trouver quelque chose qui ne fait que googler: voici, par exemple, le premier résultat de "Java threading": http://download-llnw.Oracle.com/javase/tutorial/essential/concurrency/
Cela revient essentiellement à étendre la classe Thread, à surcharger la méthode "run" avec le code appartenant à l'autre thread et à appeler la méthode "start" sur une instance de la classe que vous avez étendue.
De plus, si vous avez besoin de sécuriser un thread, jetez un œil aux méthodes synchronisées .
Le package Java.util.concurrency et le livre de Brian Goetz "La concurrence de Java en pratique"
Ralph Johnson (l'un des auteurs des modèles de conception du GoF) a également publié de nombreuses ressources sur les motifs parallèles: http://parlab.eecs.berkeley.edu/wiki/patterns/patterns
Avez-vous regardé ceci:
http://www.javacodegeeks.com/2013/02/Java-7-forkjoin-framework-example.html?ModPagespeed=noscript
The Fork/Join Framework?
J'essaie aussi d'en apprendre un peu à ce sujet.
Lisez la section «discussions» du didacticiel Java. http://download-llnw.Oracle.com/javase/tutorial/essential/concurrency/procthread.html
Vous voudrez peut-être consulter Hadoop. Il est conçu pour exécuter des tâches sur un nombre arbitraire de boîtes et prend en charge toute la comptabilité pour vous. Il s'inspire de Google MapReduce et de ses outils associés. Il provient même de l'indexation Web.
Il existe une bibliothèque appelée Habanero-Java (HJ), développée à l'Université Rice, qui a été construite à l'aide de expressions lambda et qui peut s'exécuter sur toute machine virtuelle Java 8.
HJ-lib intègre un large éventail de constructions de programmation parallèle (tâches asynchrones, futures, tâches basées sur les données, pour tous, barrières, phaseurs, transactions, acteurs) dans un modèle de programmation unique permettant des combinaisons uniques de ces constructions (par exemple, combinaisons de parallélisme tâche/acteur).
Le moteur d'exécution HJ est responsable de l'orchestration de la création, de l'exécution et de la terminaison des tâches HJ. Il comporte des planificateurs de partage et de vol de travail. Vous pouvez suivre le didacticiel pour l’installer sur votre ordinateur.
Voici un exemple 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!"));
});
});
}}
Chaque méthode async s'exécute en parallèle avec les autres méthodes async, tandis que le contenu de ces méthodes s'exécute de manière séquentielle. Le programme ne continue pas tant que tout le code de la méthode finish n'est pas terminé.
vous pouvez utiliser JCSP ( http://www.cs.kent.ac.uk/projects/ofa/jcsp/ ) la bibliothèque implémente les principes CSP (Communicating Sequential Process)) en Java, la parallélisation est extraite du niveau de thread et vous traitez plutôt avec des processus.
Vous pouvez essayer Parallel Java 2 Library .
Le professeur Alan Kaminsky a écrit sur le site:
Avance rapide jusqu'en 2013, lorsque j'ai commencé à développer PJ2. L'informatique parallèle s'est développée bien au-delà de ce qu'elle était dix ans plus tôt. Les ordinateurs parallèles multicœurs étaient équipés de beaucoup plus de cœurs de processeur et d'une mémoire principale beaucoup plus grande, de sorte que les calculs qui nécessitaient désormais un cluster entier pouvaient désormais être effectués sur un seul nœud multicœur. De nouveaux types de matériel informatique parallèle étaient devenus monnaie courante, notamment les accélérateurs d'unités de traitement graphique (GPU). Les services de cloud computing, tels que EC2 d'Amazon, permettaient à quiconque de lancer des programmes parallèles sur un superordinateur virtuel doté de milliers de cœurs. De nouveaux domaines d'application pour l'informatique parallèle s'étaient ouverts, notamment le big data analytics. De nouvelles API de programmation parallèle sont apparues, telles que OpenCL et CUDA pour la programmation parallèle par GPU de NVIDIA Corporation, et des infrastructures de réduction de carte telles que Hadoop d'Apache pour le Big Data Computing. Pour explorer et tirer parti de toutes ces tendances, j'ai décidé de créer une toute nouvelle bibliothèque Parallel Java 2.
Au début de 2013, lorsque PJ2
n'était pas encore disponible (bien qu'une version antérieure fût), j'ai essayé Java Parallel Processing Framework
(JPPF). JPPF allait bien, mais à première vue, PJ2
semble intéressant.