Avanti in Concorrenza


9

L'anno scorso ho lavorato molto sulla concorrenza in Java e ho costruito e lavorato su molti pacchetti simultanei. Quindi, in termini di sviluppo nel mondo concorrente, sono abbastanza fiducioso. Inoltre, sono molto interessato a conoscere e comprendere meglio la programmazione concorrente.

Ma non sono in grado di rispondermi quale sarà il prossimo? Quale extra dovrei imparare o lavorare per ereditare più competenze legate all'elaborazione multi-core. Se esiste un bel libro (letto e apprezzato "concorrenza nella pratica" e "programmazione concorrente in Java") o risorse relative all'elaborazione multi-core in modo da poter passare al livello successivo?


Se hai perso le basi teoriche, imparale ora: en.wikipedia.org/wiki/Pi-calculus
SK-logic

Risposte:


8

Disclaimer - Non sono un esperto di concorrenza, ma il mio coautore è, lo sto pappagallo :-)

Da quando hai letto i libri di Doug Lea e Brian Goetz, hai sicuramente trattato il miglior materiale disponibile fino ad oggi.

Andando avanti, ci sono i nuovi miglioramenti della concorrenza in Java 7. In particolare il framework Fork / Join e le nuove API NIO asincrone.

Java 8 introdurrà ulteriori miglioramenti della concorrenza con lambda / raccolte parallele.

Un'altra cosa da considerare seriamente sono i modi alternativi di gestire la concorrenza. Ad essere sinceri, l'approccio "blocca oggetti mutabili" di Java sarà sempre soggetto a errori, indipendentemente da quanto siano migliorate le API. Quindi consiglio di guardare il modello di attore di Scala e STM di Clojure come modi alternativi per affrontare i problemi di concorrenza mantenendo l'interoperabilità con Java.

[avviso -> auto pubblicità] Quindi raccomanderò naturalmente il nostro prossimo libro, The Well-Grounded Java Developer , che copre tutte le cose che ho menzionato sopra: -). [/ warning]

Per non dimenticare, Groovy ha anche una libreria Gpars altamente raccomandata, ma non l'ho usato personalmente.


Ah, grazie mille per il libro :). Puoi anche suggerire qualche altro buon libro in quanto il tuo libro raccomandato non è disponibile qui (edizione locale) in India.PS: Concurrency in Practice è un gioiello di un libro
Jatin,

@Martijn, Neat! Sono curioso di conoscere Groovy e Scala da un po 'di tempo e volevo giocarci attorno per saperne di più. Il tuo libro è rivolto ai principianti in queste lingue o presuppone un'esperienza precedente?
maple_shaft

@Jatin Puri - In realtà non conosco altri titoli sulla "concorrenza in pratica" e sulla "programmazione concorrente in Java", c'è il titolo O'Reilly di "Java Threads" di Henry Wong, ma questo è tutto.
Martijn Verburg,

@maple_shift - È rivolto ai principianti :-)
Martijn Verburg

2

Il linguaggio di programmazione D fornisce due paradigmi per la programmazione concorrente, entrambi i quali hanno i loro usi e sono piuttosto interessanti.

std.concurrency fornisce il passaggio di messaggi senza condivisione di memoria predefinita. Tutte le variabili globali e statiche in D sono thread-local per impostazione predefinita e spawne sendnon consentono l'invio di messaggi che contengono mutabile puntatore indiretto. La condivisione limitata può essere ottenuta tramite la sharedparola chiave, il che implica un controllo aggiuntivo da parte del sistema di tipi. Al di fuori del dialetto sicuro della lingua puoi forzare le variabili globali / condivise classiche in stile C / Java usando la __gsharedparola chiave, ma tutte le scommesse sono disattivate per quanto riguarda la sicurezza della gara. Questo modello è dettagliato in un capitolo gratuito del libro di Andrei Alexandresu "Il linguaggio di programmazione D".

std.parallelism è meno sicuro, ma in qualche modo più flessibile rispetto a std.concurrency ed è orientato in modo specifico ai dati multicore e al parallelismo delle attività per aumentare la velocità di elaborazione dei dati piuttosto che la concorrenza generale. Presenta un ciclo foreach parallelo, chiamate di funzione asincrone, riduzioni parallele, ecc. Fornisce meccanismi per rendere più semplice la scrittura di codice sicuro per le corse, ma ciò richiede ancora un certo grado di disciplina.

Una discussione più approfondita sui due principali paradigmi multithreading in D può essere trovata nel mio recente articolo sull'argomento.


2

Consiglio vivamente di andare a dare un'occhiata a Clojure

L'approccio alla concorrenza è molto nuovo e, a mio avviso, un progresso significativo su ciò che vedi in Java e nella maggior parte delle altre lingue. Alcuni punti chiave:

  • Identità e stato sono separati : OOP completa l'identità dell'oggetto con il suo stato corrente sotto forma di variabili membro mutabili. Clojure separa rigorosamente identità (riferimenti gestiti) e stato (strutture di dati immutabili) in un modo che semplifica in modo significativo lo sviluppo di programmi concorrenti affidabili.
  • Strutture di dati immutabili persistenti : poiché tutto è immutabile, puoi scattare un'istantanea di dati / stato in qualsiasi momento e assicurarti che non verrà mutato sotto di te. Ma meglio di questo: sono strutture di dati persistenti che condividono i dati con le versioni precedenti. Di conseguenza, le operazioni sono molto più vicine a O (1) piuttosto che a O (n) che si pagherebbe per una strategia di copia su scrittura per dati immutabili.
  • Memoria transazionale del software : anziché utilizzare i blocchi, è sufficiente racchiudere il codice in un blocco (dosync ...) e questi vengono automaticamente eseguiti come una transazione. Nessun rischio di deadlock e nessuna necessità di sviluppare strategie di blocco complesse. Questa è una vittoria enorme, specialmente se combinata con le strutture di dati immutabili sopra. In effetti, Clojure implementa il controllo della concorrenza multi-versione nella sua STM.
  • Il paradigma di programmazione funzionale viene utilizzato per semplificare la scrittura di codice concorrente affidabile. Fondamentalmente se prendi una struttura di dati immutabile, esegui una funzione pura e genera una struttura di dati immutabile diversa, il tuo codice è garantito per la concorrenza.

Suggerirei di guardare questo video come introduzione


1

Dai un'occhiata al linguaggio Scala, che estende Java e gira su JVM. Prende in prestito il concetto di "attori" da Erlang e offre buone capacità per gestire i fallimenti della concorrenza.


1

Se vuoi portarlo a un livello completamente nuovo, potresti voler esaminare la programmazione con CUDA .

Ciò consente di distribuire gli algoritmi su centinaia di core di elaborazione sulla scheda grafica anziché sui pochi core della CPU principali. Esistono persino associazioni di lingue che apparentemente rendono relativamente facile accelerare linguaggi di alto livello come Python usando le tecniche GPGPU .


@Chiron - Ad essere sincero, sono rimasto sorpreso dal fatto che nessun altro lo avesse già menzionato.
Mark Booth,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.