Programmazione parallela in Java


Come possiamo fare la programmazione parallela in Java? C'è qualche quadro speciale per questo? Come possiamo far funzionare la roba?

Vi dirò di cosa ho bisogno, pensate che ho sviluppato un web crawler, il suo sacco di siti web da Internet, un sistema di scansione non farà funzionare le cose correttamente, quindi abbiamo bisogno di 1000 di sistema per funzionare,se questo è il caso posso applicare il calcolo parallelo?Potete darmi un buon esempio?

Author: John Topley, 2010-07-28

18 answers

Se stai chiedendo della programmazione parallela pura cioè non concorrente allora dovresti assolutamente provare MPJExpress http://mpj-express.org / . È un'implementazione thread-safe di mpiJava e supporta modelli di memoria distribuiti e condivisi. L'ho provato e trovato molto affidabile.

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 delle funzionalità più comuni fornite dalle librerie di messaggistica come MPJ Express è il supporto della comunicazione punto-punto tra esecuzione di processi. In questo contesto, due processi appartenenti allo stesso comunicatore (ad esempio l'MPI.COMM_WORLD communicator) possono comunicare tra loro inviando e ricevendo messaggi. Una variante del metodo Send () viene utilizzata per inviare il messaggio dal processo del mittente. D'altra parte, il messaggio inviato viene ricevuto dal processo ricevente utilizzando una variante del metodo Recv (). Sia il mittente che il destinatario specificano un tag che viene utilizzato per trovare lato ricevitore.

Dopo aver inizializzato la libreria MPJ Express utilizzando l'MPI.Metodo Init (args) sulla riga 12, il programma ottiene il suo rango e la dimensione dell'MPI.Comunicatore COMM_WORLD. Entrambi i processi inizializzano un array intero di lunghezza 10 chiamato buffer sulla riga 18. Il processo mittente-rank 0-memorizza un valore di 10 nel primo elemento dell'array msg. Una variante del metodo Send () viene utilizzata per inviare un elemento dell'array msg al processo del ricevitore.

Il processo mittente chiama il Invia () metodo sulla linea 27. I primi tre argomenti sono relativi ai dati inviati. L'invio di bu!la bu!er array-è il primo argomento seguito da 0 (o!set) e 1 (conteggio). I dati inviati sono di MPI.INT digitare e la destinazione è 1( variabile peer); il tipo di dati e la destinazione sono specificati come quarto e quinto argomento del metodo Send (). L'ultimo e il sesto argomento è la variabile tag. Un tag viene utilizzato per identificare i messaggi sul lato ricevitore. Un tag messaggio è in genere un identificatore di un particolare messaggio in un comunicatore specifico. D'altra parte il processo di ricezione (rango 1) riceve il messaggio utilizzando il metodo di ricezione di blocco.

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

Java supporta i thread, quindi è possibile avere un'applicazione Java multi thread. Raccomando vivamente il libro Concurrent Programming in Java: Design Principles and Patterns per questo:

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

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

Si desidera esaminare il framework di elaborazione parallela Java (JPPF)

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

Puoi dare un'occhiata a Hadoope Hadoop Wiki.Questo è un framework apache ispirato a Google map-reduce.It consente di eseguire il calcolo distribuito utilizzando più sistemi.Molte aziende come Yahoo, Twitter lo usano ( Siti alimentati da Hadoop ).Controlla questo libro per ulteriori informazioni su come usarlo Hadoop Book .

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

Questa è la risorsa di programmazione parallela a cui sono stato indicato in passato:

Http://www.jppf.org /

Non ho idea se sia buono o meno, solo che qualcuno lo ha raccomandato qualche tempo fa.

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

In java l'elaborazione parallela viene eseguita utilizzando thread che fanno parte della libreria di runtime

Il tutorial Concurrency dovrebbe rispondere a molte domande su questo argomento se sei nuovo alla programmazione java e parallela.

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

Ne ho sentito parlare alla conferenza alcuni anni fa - ParJava. Ma non sono sicuro dello stato attuale del progetto.

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

Per quanto ne so, sulla maggior parte dei sistemi operativi il meccanismo di Threading di Java dovrebbe essere basato su thread reali del kernel. Questo è buono dalla prospettiva di programmazione parallela. Altri linguaggi come Python semplicemente fanno un po ' di tempo multiplexing del processore (vale a dire, se si esegue un'applicazione multithread pesante su una macchina multiprocessore vedrete solo un processore in esecuzione).

Puoi facilmente trovare qualcosa solo su Google: per esempio questo è il primo risultato per " java infilare": http://download-llnw.oracle.com/javase/tutorial/essential/concurrency /

Fondamentalmente si riduce a estendere la classe Thread, sovraccaricare il metodo "run" con il codice appartenente all'altro thread e chiamare il metodo "start" su un'istanza della classe estesa.

Inoltre, se è necessario rendere qualcosa di thread sicuro, dare un'occhiata ai metodi sincronizzati .

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

Java.util.concurrency package e il libro di Brian Goetz "Java concurrency in practice"

Ci sono anche molte risorse qui sui modelli paralleli di Ralph Johnson (uno degli autori del modello di progettazione GoF) : http://parlab.eecs.berkeley.edu/wiki/patterns/patterns

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

Il ciclo parallelo di Ateji PX è quello che stai cercando ? Questo eseguirà la scansione di tutti i siti in parallelo (si noti la doppia barra accanto alla parola chiave for):

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

Se hai bisogno di comporre i risultati della scansione, probabilmente vorrai usare una comprensione parallela, come ad esempio :

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

Ulteriori letture qui: 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

Si potrebbe desiderare di controllare Hadoop. E ' progettato per avere posti di lavoro in esecuzione su una quantità arbitraria di scatole e si prende cura di tutta la contabilità per voi. È ispirato a MapReduce di Google e ai loro strumenti correlati e quindi proviene anche dall'indicizzazione web.

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

Hai guardato questo:

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

Il framework Fork / Join?

Sto anche cercando di imparare un po ' su questo.

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

Parallelismo

Parallelismo significa che un'applicazione suddivide le sue attività in sottoattività più piccole che possono essere elaborate in parallelo, ad esempio su più CPU contemporaneamente. inserisci qui la descrizione dell'immagine

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

È possibile utilizzare JCSP (http://www.cs.kent.ac.uk/projects/ofa/jcsp / ) la libreria implementa i principi CSP (Communicating Sequential Processes) in Java, la parallelizzazione viene astratta dal livello del thread e si gestiscono invece i processi.

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

Java SE 5 e 6 hanno introdotto una serie di pacchetti in java.util.simultaneo.* che forniscono potenti blocchi di costruzione della concorrenza. controllare questo per ulteriori informazioni. http://www.oracle.com/technetwork/articles/java/fork-join-422606.html

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

Potresti provare Libreria Java 2 parallela .

Sul sito il Prof. Alan Kaminsky ha scritto:

Avanti veloce al 2013, quando ho iniziato a sviluppare PJ2. Il calcolo parallelo si era espanso ben oltre quello che era un decennio prima. I computer paralleli multicore erano dotati di molti più core CPU e memoria principale molto più grande, in modo tale che i calcoli che prima richiedevano un intero cluster ora potevano essere eseguiti su un singolo nodo multicore. Nuovi tipi di hardware di calcolo parallelo era diventato un luogo comune, in particolare graphics Processing Unit (GPU) acceleratori. Servizi di cloud computing, come EC2 di Amazon, ha permesso a chiunque di eseguire programmi paralleli su un supercomputer virtuale con migliaia di core. Si sono aperte nuove aree applicative per il calcolo parallelo, in particolare l'analisi dei big data. Erano sorte nuove API di programmazione parallela, come CUDA di OpenCL e NVIDIA Corporation per la programmazione parallela GPU e framework di riduzione delle mappe come Hadoop di Apache per il calcolo dei big data. Per esplora e approfitta di tutte queste tendenze, ho deciso che era necessaria una libreria Java 2 parallela completamente nuova.

All'inizio del 2013, quando PJ2 non era ancora disponibile (anche se una versione precedente era), ho provato Java Parallel Processing Framework (JPPF). JPPF andava bene ma a prima vista PJ2 sembra interessante.

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

Esiste una libreria chiamata Habanero-Java (HJ), sviluppata presso la Rice University che è stata costruita usando espressioni lambda e può essere eseguita su qualsiasi JVM Java 8.

HJ-lib integra una vasta gamma di costrutti di programmazione parallela (ad esempio, attività asincrone, futures, attività data-driven, forall, barriere, phaser, transazioni, attori) in un unico modello di programmazione che consente combinazioni uniche di questi costrutti (ad esempio, combinazioni nidificate di attività e attore parallelismo).

Il runtime HJ è responsabile di orchestrare la creazione, l'esecuzione e la cessazione delle attività HJ, e dispone di pianificatori sia di condivisione del lavoro che di furto del lavoro. Puoi seguire il tutorial per configurarlo sul tuo computer.

Ecco un semplice esempio di 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!"));
        });

    });
}}

Ogni metodo async viene eseguito in parallelo con gli altri metodi async, mentre il contenuto di questi metodi viene eseguito in sequenza. Il programma non continua fino a quando tutto il codice all'interno il metodo finish è completo.

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