Programmation parallèle en Java


Comment pouvons-nous faire de la programmation parallèle en Java? Est-il un cadre spécial pour cela? Comment pouvons-nous faire fonctionner les choses?

Je vais vous dire ce dont j'ai besoin, je pense que je suis développé un robot d'exploration Web, son lot de site Web à partir d'Internet, un système d'exploration ne fera pas fonctionner correctement, nous avons donc besoin de 1000 systèmes pour fonctionner, si tel est le cas, puis-je appliquer le calcul parallèle?Pouvez-vous les gars m'a donné un bon exemple?

Author: John Topley, 2010-07-28

18 answers

Si vous posez des questions sur la programmation parallèle pure , c'est-à-dire non simultanée, alors vous devriez certainement essayer MPJExpress http://mpj-express.org / . C'est une implémentation thread-safe de mpiJava et il 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 fournies par les bibliothèques de messagerie comme MPJ Express est la prise en charge de la communication point à point entre l'exécution de processus. Dans ce contexte, deux processus appartenant au même communicateur (par exemple le MPI.COMM_WORLD communicator) peuvent communiquer entre eux en envoyant et en recevant des messages. Une variante de la méthode Send () est utilisée pour envoyer le message depuis le 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 deux une balise utilisée pour trouver un message entrant correspondant au côté récepteur.

Après avoir initialisé la bibliothèque MPJ Express à l'aide du MPI.Méthode Init (args) à la ligne 12, le programme obtient son rang et la taille du MPI.COMM_MONDE communicateur. Les deux processus initialisent un tableau entier de longueur 10 appelé buffer sur la ligne 18. Le processus expéditeur-rang 0-stocke 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 le Méthode Send () à la ligne 27. Les trois premiers arguments sont liés aux données envoyées. L'envoi de la bu!euh-le bu!er array-est le premier argument suivi de 0 (o!set) et 1 (le comte). Les données envoyées sont de MPI.INT type 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 argument 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 récepteur. Une balise de message est généralement un identifiant d'un message particulier dans un communicateur. D'autre part, le processus récepteur (rang 1) reçoit le message en utilisant la méthode de réception de blocage.

 18
Author: Adil Mehmood, 2010-07-29 09:30:26

Java prend en charge les threads, vous pouvez donc avoir une application Java multithread. Je recommande fortement le livre Programmation simultanée en Java: Design Principles and Patterns pour cela:

Http://java.sun.com/docs/books/cp/

 8
Author: Manuel Selva, 2010-07-28 06:46:20

Vous voulez regarder le framework de traitement parallèle Java ( JPPF)

 8
Author: John Channing, 2010-07-28 11:55:10

, Vous pouvez avoir un coup d'oeil à Hadoop et Hadoop Wiki.Ceci est un framework apache inspiré de google map-reduce.It vous permet de faire de l'informatique distribuée en utilisant plusieurs systèmes.De nombreuses entreprises comme Yahoo, Twitter l'utilisent (Sites Alimentés Par Hadoop ).Vérifiez ce livre pour plus d'informations sur la façon de l'utiliser Hadoop Livre.

 7
Author: Emil, 2012-10-18 06:01:48

Ceci est la ressource de programmation parallèle que j'ai été pointé dans le passé:

Http://www.jppf.org/

Je n'ai aucune idée si c'est bon ou non, juste que quelqu'un l'a recommandé il y a quelque temps.

 3
Author: Richard, 2010-07-28 10:11:43

En java, le traitement parallèle est effectué à l'aide de threads qui font partie de la bibliothèque d'exécution

Le didacticielde concurrence devrait répondre à beaucoup de questions sur ce sujet si vous êtes nouveau dans java et la programmation parallèle.

 2
Author: stacker, 2010-07-28 06:45:14

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.

 2
Author: grigy, 2010-07-28 06:45:14

Pour autant que je sache, sur la plupart des systèmes d'exploitation, le mécanisme de threading de Java devrait être basé sur de vrais threads du noyau. C'est bon de la programmation parallèle prospective. D'autres langages comme Python font simplement un multiplexage temporel du processeur (à savoir, si vous exécutez une application multithread heavvy sur une machine multiprocesseur, vous ne verrez qu'un seul processeur en cours d'exécution).

Vous pouvez facilement trouver quelque chose en le googlant: par exemple, c'est le premier résultat pour " java filetage": http://download-llnw.oracle.com/javase/tutorial/essential/concurrency/

Fondamentalement, il se résume à é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.

Aussi, si vous avez besoin de rendre quelque chose de thread sûr, jetez un oeil aux méthodes synchronisées.

 2
Author: Dacav, 2010-07-28 06:47:01

Java.util.le paquet de concurrence et le livre de Brian Goetz "Java concurrency in practice"

Il y a aussi beaucoup de ressources ici sur les modèles parallèles par Ralph Johnson (l'un des auteurs du modèle de conception GoF) : http://parlab.eecs.berkeley.edu/wiki/patterns/patterns

 2
Author: Bruno Thomas, 2010-07-28 11:58:40

La boucle Ateji PX parallel-for est-elle ce que vous recherchez ? Cela explorera tous les sites en parallèle (notez la double barre à côté du mot-clé for):

for||(Site site : sites) {
  crawl(site);
}

Si vous avez besoin de 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 }

Lire la suite ici: http://www.ateji.com/px/whitepapers/Ateji%20PX%20for%20Java%20v1.0.pdf

 2
Author: Patrick Viry, 2010-07-28 12:11:24
 1
Author: Thorbjørn Ravn Andersen, 2010-07-28 08:17:46

Vous voudrez peut-être vérifier Hadoop. Il est conçu pour que les travaux s'exécutent sur une quantité arbitraire de boîtes et s'occupe de toute la comptabilité pour vous. Il est inspiré de MapReduce de Google et de leurs outils associés et provient donc même de l'indexation Web.

 1
Author: Nicolas78, 2010-07-28 10:06:02

Avez-vous regardé ceci:

Http://www.javacodegeeks.com/2013/02/java-7-forkjoin-framework-example.html?ModPagespeed=noscript

Le cadre Fork / Join?

J'essaie aussi d'en apprendre un peu plus à ce sujet.

 1
Author: dagadbm, 2013-08-22 10:41:53

Le Parallélisme

Le parallélisme signifie qu'une application divise ses tâches en sous-tâches plus petites qui peuvent être traitées en parallèle, par exemple sur plusieurs PROCESSEURS en même temps. entrez la description de l'image ici

 1
Author: Pavan Reddy, 2018-01-31 06:40:33

Vous pouvez utiliser JCSP (http://www.cs.kent.ac.uk/projects/ofa/jcsp / ) la bibliothèque implémente les principes CSP (Communicating Sequential Processes) en Java, la parallélisation est abstraite au niveau des threads et vous traitez plutôt des processus.

 0
Author: user1125516, 2013-12-23 10:22:28

Java SE 5 et 6 ont introduit un ensemble de paquets en java.util.simultané.* qui fournissent des blocs de construction de concurrence puissants. vérifiez ceci pour plus d'informations. http://www.oracle.com/technetwork/articles/java/fork-join-422606.html

 0
Author: user3403531, 2014-06-27 13:19:21

Vous pouvez essayer Bibliothèque Java 2 parallèle.

Sur le site, le professeur Alan Kaminsky a écrit:

Avance rapide vers 2013, quand j'ai commencé à développer PJ2. L'informatique parallèle s'était développée bien au-delà de ce qu'elle était une décennie plus tôt. Les ordinateurs parallèles multicœurs étaient équipés de beaucoup plus de cœurs de processeur et de mémoire principale beaucoup plus grande, de sorte que les calculs qui nécessitaient un cluster entier pouvaient maintenant être effectués sur un seul nœud multicœur. 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 d'exécuter des programmes parallèles sur un supercalculateur virtuel avec des milliers de cœurs. De nouveaux domaines d'application pour l'informatique parallèle s'étaient ouverts, notamment l'analyse des mégadonnées. De nouvelles API de programmation parallèle étaient apparues, telles que OpenCL et CUDA de NVIDIA Corporation pour la programmation parallèle GPU, et des frameworks de réduction de carte comme Hadoop d'Apache pour l'informatique Big Data. De explorer et profiter de toutes ces tendances, j'ai décidé qu'une toute nouvelle bibliothèque Java 2 parallèle était nécessaire.

Début 2013 alors que PJ2 n'était pas encore disponible (bien qu'une version antérieure l'était), j'ai essayé Java Parallel Processing Framework (JPPF). JPPF était correct mais à première vue PJ2 semble intéressant.

 0
Author: H2ONaCl, 2016-01-12 02:22:33

Il existe une bibliothèque appelée Habanero-Java (HJ), développée à l'Université Rice qui a été construite en utilisant lambda expressions et peut fonctionner sur n'importe quelle JVM Java 8.

HJ-lib intègre un large éventail de constructions de programmation parallèle (par exemple, tâches asynchrones, futures, tâches pilotées par les données, forall, barrières, phaseurs, transactions, acteurs) dans un modèle de programmation unique qui permet des combinaisons uniques de ces constructions (par exemple, combinaisons imbriquées de parallélisme de tâche et d'acteur).

Le runtime HJ est responsable de l'orchestration de la création, de l'exécution et de la fin des tâches HJ, et dispose à la fois de planificateurs de partage de travail et de vol de travail. Vous pouvez suivre le tutoriel pour l'installer sur votre ordinateur.

Voici un exemple HelloWorld simple:

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 séquentiellement. Le programme ne continue pas jusqu'à ce que tout le code dans la méthode finish est terminée.

 0
Author: Amanda Nguyen, 2017-08-12 08:41:55