Programmation parallèle en Java

Comment 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, pense que je suis développé un robot d'exploration web, son crawl beaucoup de site web à partir d'internet, un système d'exploration ne fera pas fonctionner les choses correctement, donc nous avons besoin de 1000 de système pour fonctionner, si c'est le cas puis-je appliquer le calcul parallèle?Pouvez-vous les gars m'a donné un bon exemple?

35
demandé sur John Topley 2010-07-28 10:41:19

18 réponses

Si vous posez des questions sur la programmation parallèle pure c'est-à-dire non concurrente , 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) peut communiquer entre eux 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 récepteur spécifient une balise qui est 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.Communicateur COMM_WORLD. 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 Envoyer () méthode sur la ligne 27. Les trois premiers arguments sont liés aux données envoyées. L'envoi de la bu!er-la bu!er array - est le premier argument suivi de 0 (o!ensemble) et 1 (Compter). 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 une 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 bloquante.

18
répondu Adil Mehmood 2010-07-29 09:30:26

Java prend en charge les threads, vous pouvez donc avoir une application Java multi-thread. Je recommande fortement le Programmation Concurrente en Java: Principes de Conception et les Modèles livre pour que:

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

8
répondu Manuel Selva 2010-07-28 06:46:20

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

8
répondu 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é par 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
répondu Emil 2012-10-18 06:01:48

C'est la ressource de programmation parallèle à laquelle 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 un moment.

3
répondu 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 tutoriel Concurrency {[4] } devrait répondre à beaucoup de questions sur ce sujet si vous êtes nouveau en java et en programmation parallèle.

2
répondu 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
répondu 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 lourde 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 de 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 thread sûr, jetez un oeil à la méthodes synchronisées.

2
répondu Dacav 2010-07-28 06:47:01

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

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

2
répondu Bruno Thomas 2010-07-28 11:58:40

La boucle ateji px parallel-for est-elle ce que vous recherchez ? Cela va explorer 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, alors vous voudrez probablement utiliser une compréhension parallèle, telle que:

Set result = set for||{ crawl(site) | Site site : sites }

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

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

Vous pourriez vouloir vérifier Hadoop. Il est conçu pour avoir des travaux en cours d'exécution sur une quantité arbitraire de boîtes et prend soin de toute la comptabilité pour vous. Il est inspiré par MapReduce de Google et leurs outils connexes et il vient même de l'indexation web.

1
répondu 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'apprendre un peu à ce sujet.

1
répondu 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
répondu 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 du niveau du thread et vous traitez à la place des processus.

0
répondu 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. cochez cette pour plus d'informations. http://www.oracle.com/technetwork/articles/java/fork-join-422606.html

0
répondu user3403531 2014-06-27 13:19:21

, Tu pourrais essayer de Parallèle Java 2 Bibliothèque.

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

Avance rapide à 2013, quand j'ai commencé à développer PJ2. Le calcul parallèle s'était étendu bien au-delà de ce qu'il é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 était devenu monnaie courante, notamment les accélérateurs d'Unité de traitement graphique (GPU). Les services de Cloud computing, tels que EC2 D'Amazon, ont permis à quiconque d'exécuter des programmes parallèles sur un supercalculateur virtuel avec des milliers de cœurs. De nouveaux domaines d'application pour le calcul parallèle s'étaient ouverts, notamment l'analyse des big data. De nouvelles API de programmation parallèle ont vu le jour, telles que CUDA D'OpenCL et de NVIDIA Corporation pour la programmation parallèle GPU, et des frameworks map-reduce comme Hadoop D'Apache pour le big data computing. De explorez et profitez de toutes ces tendances, j'ai décidé qu'une toute nouvelle bibliothèque parallèle Java 2 é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
répondu 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 propose à la fois des 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 à l'intérieur la méthodefinish est terminée.

0
répondu Amanda Nguyen 2017-08-12 08:41:55