Weiter in Parallelität

9

Im vergangenen Jahr habe ich viel an Parallelität in Java gearbeitet und viele gleichzeitige Pakete erstellt und bearbeitet. In Bezug auf die Entwicklung in der gleichzeitigen Welt bin ich also ziemlich zuversichtlich. Außerdem bin ich sehr daran interessiert, mehr über die gleichzeitige Programmierung zu lernen und zu verstehen.

Aber ich kann mir nicht antworten, was als nächstes kommt? Welches Extra sollte ich lernen oder daran arbeiten, um mehr Fähigkeiten im Zusammenhang mit der Multi-Core-Verarbeitung zu erben? Gibt es ein schönes Buch (lesen und genießen Sie "Parallelität in der Praxis" und "Gleichzeitige Programmierung in Java") oder Ressourcen, die sich auf die Multi-Core-Verarbeitung beziehen, damit ich zum nächsten Level übergehen kann?

Jatin
quelle
Wenn Sie die theoretischen Grundlagen verpasst haben, lernen Sie sie jetzt: en.wikipedia.org/wiki/Pi-calculus
SK-Logik

Antworten:

8

Haftungsausschluss - Ich bin kein Experte für Parallelität, aber mein Co-Autor ist, ich mache ihm Papageien :-)

Seit Sie die Bücher von Doug Lea und Brian Goetz gelesen haben, haben Sie definitiv das bisher beste Material behandelt.

In Zukunft gibt es die neuen Verbesserungen für die Parallelität in Java 7. Am deutlichsten sind das Fork / Join-Framework und die neuen asynchronen NIO-APIs.

Java 8 wird weitere Verbesserungen der Parallelität mit Lambdas / parallelen Sammlungen einführen.

Eine andere Sache, die ernsthaft in Betracht gezogen werden sollte, sind alternative Möglichkeiten, mit Parallelität umzugehen. Um ehrlich zu sein, Javas Ansatz "Sperable Mutable Objects" wird immer fehleranfällig sein, unabhängig davon, wie stark die APIs verbessert werden. Daher empfehle ich, das Darstellermodell von Scala und das STM von Clojure als alternative Möglichkeiten zu betrachten, um Parallelitätsprobleme zu lösen und gleichzeitig die Interoperabilität mit Java aufrechtzuerhalten.

[Warnung -> Eigenwerbung] Daher empfehle ich natürlich unser nächstes Buch, The Well-Grounded Java Developer , das alle oben genannten Dinge behandelt: -). [/ warning]

Damit ich nicht vergesse, hat Groovy auch eine sehr empfehlenswerte Gpars-Bibliothek, die ich jedoch nicht persönlich verwendet habe.

Martijn Verburg
quelle
Ha vielen Dank für das Buch :). Können Sie bitte auch ein anderes gutes Buch vorschlagen, da Ihr empfohlenes Buch hier (lokale Ausgabe) in Indien nicht verfügbar ist? PS: Parallelität in der Praxis ist ein Juwel eines Buches
Jatin
@ Martinijn, ordentlich! Ich war schon eine Weile neugierig auf Groovy und Scala und wollte damit herumspielen, um mehr zu erfahren. Ist Ihr Buch auf Anfänger in diesen Sprachen ausgerichtet oder setzt es Vorkenntnisse voraus?
maple_shaft
@Jatin Puri - Ich kenne wirklich keine anderen Titel über "Parallelität in der Praxis" und "gleichzeitige Programmierung in Java", es gibt Henry Wongs "Java Threads" O'Reilly-Titel, aber das war es auch schon.
Martijn Verburg
@maple_shift - Es richtet sich an Anfänger :-)
Martijn Verburg
2

Die Programmiersprache D bietet zwei Paradigmen für die gleichzeitige Programmierung, die beide ihre Verwendung haben und ziemlich interessant sind.

std.concurrency bietet Nachrichtenübermittlung ohne Standardspeicherfreigabe. Alle globalen und statischen Variablen in D sind standardmäßig threadlokal spawnund senderlauben nicht das Senden von Nachrichten, die eine Indirektion mit veränderbaren Zeigern enthalten. Eine eingeschränkte Freigabe kann über das sharedSchlüsselwort erreicht werden, was eine zusätzliche Überprüfung durch das Typsystem erfordert. Außerhalb des sicheren Dialekts der Sprache können Sie mit dem __gsharedSchlüsselwort klassische globale / gemeinsam genutzte Variablen im C / Java-Stil erzwingen. In Bezug auf die Rennsicherheit sind dann alle Wetten ungültig. Dieses Modell wird in einem kostenlosen Kapitel von Andrei Alexandresus Buch "The D Programming Language" beschrieben.

std.parallelism ist weniger sicher, aber in gewisser Weise flexibler als std.concurrency und ist speziell auf Multicore-Daten und Task-Parallelität ausgerichtet, um den Datenverarbeitungsdurchsatz zu erhöhen, anstatt die allgemeine Parallelität. Es verfügt über eine parallele foreach-Schleife, asynchrone Funktionsaufrufe, parallele Reduzierungen usw. Es bietet Mechanismen, die das Schreiben von rennsicherem Code erleichtern, erfordert jedoch noch ein gewisses Maß an Disziplin.

Eine ausführlichere Diskussion über die beiden wichtigsten Multithreading-Paradigmen in D findet sich in meinem kürzlich erschienenen Artikel zu diesem Thema.

Dsimcha
quelle
2

Ich würde Ihnen dringend empfehlen, sich Clojure anzusehen

Der Ansatz zur Parallelität ist sehr neu und meiner Ansicht nach ein bedeutender Fortschritt gegenüber dem, was Sie in Java und den meisten anderen Sprachen sehen. Einige wichtige Punkte:

  • Identität und Status sind getrennt - OOP ergänzt die Objektidentität mit ihrem aktuellen Status in Form von veränderlichen Elementvariablen. Clojure trennt Identität (verwaltete Referenzen) und Status (unveränderliche Datenstrukturen) auf eine Weise, die die Entwicklung zuverlässiger gleichzeitiger Programme erheblich vereinfacht.
  • Persistente unveränderliche Datenstrukturen - da alles unveränderlich ist, können Sie jederzeit eine Momentaufnahme der Daten / des Status erstellen und sicher sein, dass diese nicht unter Ihnen mutiert werden. Aber besser als das - es handelt sich um persistente Datenstrukturen, die Daten mit früheren Versionen gemeinsam nutzen. Infolgedessen sind Operationen viel näher an O (1) als an O (n), das Sie für eine Copy-on-Write-Strategie für unveränderliche Daten bezahlen würden.
  • Software-Transaktionsspeicher - anstatt Sperren zu verwenden, schließen Sie Code einfach in einen (dosync ...) Block ein und sie werden automatisch als Transaktion ausgeführt. Kein Risiko von Deadlocks und keine Notwendigkeit, komplexe Sperrstrategien zu entwickeln. Dies ist ein enormer Gewinn, insbesondere in Kombination mit den oben genannten unveränderlichen Datenstrukturen. Tatsächlich implementiert Clojure in seinem STM die Parallelitätskontrolle für mehrere Versionen .
  • Das funktionale Programmierparadigma wird verwendet, um das Schreiben von zuverlässigem gleichzeitigem Code zu vereinfachen. Wenn Sie eine unveränderliche Datenstruktur verwenden, eine reine Funktion ausführen und eine andere unveränderliche Datenstruktur ausgeben, ist Ihr Code grundsätzlich garantiert für die Parallelität.

Ich würde vorschlagen , dieses Video als Einführung anzusehen

mikera
quelle
1

Schauen Sie sich die Scala-Sprache an, die Java erweitert und auf der JVM ausgeführt wird. Es leiht sich den Begriff "Schauspieler" von Erlang aus und bietet eine gute Möglichkeit zur Behandlung von Parallelitätsfehlern.

Matthew Flynn
quelle
1

Wenn Sie es auf eine ganz neue Ebene bringen möchten, sollten Sie sich mit der Programmierung mit CUDA befassen .

Auf diese Weise können Sie Ihre Algorithmen auf Hunderte von Prozessorkernen auf Ihrer Grafikkarte anstatt auf die wenigen Haupt-CPU-Kerne verteilen. Es gibt sogar Sprachbindungen, die es anscheinend relativ einfach machen, Hochsprachen wie Python mithilfe von GPGPU- Techniken zu beschleunigen .

Mark Booth
quelle
@Chiron - Um ehrlich zu sein, war ich überrascht, dass es noch niemand erwähnt hatte.
Mark Booth