Ich bin in erster Linie ein Java-Entwickler und habe viel über Threads und Parallelität gelesen. Viele sehr kluge Leute (Doug Lea, Brian Goetz, etc.) haben Bücher zu diesen Themen verfasst und Beiträge zu neuen Concurrency-Bibliotheken für Java geleistet.
Wenn ich anfange, mehr über Python, Ruby und andere Sprachen zu lernen, frage ich mich: Muss all diese Arbeit für diese Sprachen neu erstellt werden?
Wird es da einen Doug Lea von Python oder einen Brian Goetz von Ruby geben, der ähnlich starke Beiträge zu den Nebenläufigkeitsmerkmalen dieser Sprachen leistet?Muss all diese Parallelitätsarbeit, die in Java geleistet wurde, für zukünftige Sprachen neu erstellt werden? Oder wird die Arbeit in Java Lektionen und Anleitungen für zukünftige Sprachen enthalten?
Die Grundprinzipien der konkurrierenden Programmierung existierten vor Java und wurden in jenen Java-Büchern zusammengefasst, von denen du sprichst. Die java.util.concurrent-Bibliothek wurde in ähnlicher Weise aus früheren Code- und Forschungsarbeiten zur gleichzeitigen Programmierung abgeleitet.
Einige Implementierungsprobleme sind jedoch spezifisch für Java. Es verfügt über ein spezifiziertes Speichermodell, und die gleichzeitig verfügbaren Dienstprogramme in Java sind auf die Besonderheiten zugeschnitten. Mit einigen Änderungen können diese in andere Sprachen / Umgebungen mit unterschiedlichen Speichermodelleigenschaften portiert werden.
Sie brauchen also vielleicht ein Buch, um Ihnen die kanonische Verwendung der Nebenläufigkeitswerkzeuge in anderen Sprachen beizubringen, aber es würde das Rad nicht neu erfinden.
Denken Sie daran, dass Threads nur eines von mehreren möglichen Modellen für den Umgang mit "Nebenläufigkeit" sind. Python hat zum Beispiel eines der fortschrittlichsten asynchronen (ereignisbasierten) Modelle ohne Threads in Twisted . Nicht-blockierende Modelle sind sehr leistungsfähig und werden als Alternative zu Threads in den meisten Anwendungen mit der höchsten Skalierungsleistung verwendet (z. B. nginx, lighttpd).
Ihre Annahme, dass andere populäre Sprachen Threads benötigen, kann einfach ein Symptom einer Java-zentrischen (und damit threadzentrischen) Weltansicht sein. Werfen Sie einen Blick auf die C10K Seite für einen leicht veralteten, aber sehr informativen Blick auf mehrere Modelle für den Umgang mit großen Mengen gleichzeitig Anfragen.
Ich denke, die Antwort ist sowohl Ja als auch Nein. Java hat wohl die am besten definierte Speichermodell- und Ausführungssemantik der am häufigsten verwendeten imperativen Sprachen (Java, C ++, Python, Ruby usw.). In mancherlei Hinsicht fehlt es anderen Sprachen entweder vollständig oder spielt Aufholjagd (wenn das angesichts der Unreife der Threading-Modelle sogar möglich ist).
C ++ ist wahrscheinlich die bemerkenswerte Ausnahme - es hat die gleiche Ursache für C ++ 0x genommen und ist möglicherweise von meinem Eindruck über den aktuellen Zustand des Java-Modells hinausgegangen.
Ich sage nein, weil die Gemeinschaften nicht isoliert sind. Viele der Leute, die an diesem Zeug arbeiten, sind (zumindest aus der Sicht der Führung, wenn nicht aus einer direkten Hand in den Spezifikationen) in mehr als einer Sprache involviert. Es gibt also viel Crosstalk zwischen Leuten, die an JMM arbeiten, und Leuten, die an C ++ 0x - Spezifikationen arbeiten, da sie im Wesentlichen dieselben Probleme mit vielen der gleichen zugrundeliegenden Treiber lösen (von den Hardware - Jungs am unteren Ende und den Benutzern am oben). Und ich bin mir ziemlich sicher, dass zwischen den JVM / CLR Camps auch ein gewisses Nebeneinander besteht.
Wie bereits erwähnt, gibt es auch andere Modelle für Nebenläufigkeit: Schauspieler in Erlang und Scala, Agenten / STM in Clojure, FPs Aufstieg in F #, Scala, Haskell, die CCR- und PLINQ-Sachen in CLR-Land usw. Es ist ein aufregende Zeit gerade jetzt! Wir können so viele Parallelitätsexperten verwenden, wie wir finden können, denke ich ....:)
Dies ist kein Flammenköder, aber IMHO Java verfügt über eines der einfacheren und stärker eingeschränkten Modelle für Threading und Parallelität. Das ist nicht unbedingt eine schlechte Sache, aber auf der Ebene der Granularität bedeutet es, dass die Perspektive, die es Ihnen gibt, was Nebenläufigkeit ist und wie damit umzugehen, inhärent begrenzt ist, wenn Sie eine "Java-zentrische" Ansicht haben (wie jemand anders gesagt) es).
Wenn Sie es mit Parallelität ernst meinen, dann lohnt es sich, andere Sprachen genau zu untersuchen, da verschiedene Modelle und Idiome existieren.
Einige der heißesten Bereiche sind Lock-Free-Programmierung (Sie werden viel davon sehen, aber oft in C ++ schlecht gemacht) und funktionale Programmierung (die schon eine Weile existiert, aber wohl immer mehr an Bedeutung gewinnt). Ein Paradebeispiel für Nebenläufigkeit ist wahrscheinlich Erlang).
Kamaelia ist ein Projekt (mit dem ich begonnen habe und an dem ich weiter arbeite), das speziell darauf abzielt, Nebenläufigkeit zu einem Werkzeug zu machen Sie möchten verwenden, anstatt einen Schmerz zu benutzen. In der Praxis bedeutet dies, dass es in erster Linie ein Shared-Nothing-Modell mit Message-Passing-Modell ist (basierend auf einer Weltansicht von Occam & amp; Unix-Pipes).
Diesem Ziel liegt der Wunsch zugrunde, die Gleichzeitigkeit für den durchschnittlichen Entwickler einfach zu machen und sie vor den unangenehmeren Problemen zu schützen, die durch eine Reihe von Konzepten für Parallelität verursacht werden. (Es gibt eine Reihe von Präsentationen auf Slideshare erklären, warum und wie dort)
Zusätzlich bietet es ein einfaches Software-Transaktionsspeichermodell für die Situationen, in denen Sie Daten teilen müssen, und verwendet eine bewusst einfache API.
Kamaelias primäre Implementierung ist in Python, mit einer Toy-Implementierung in Ruby & amp; C ++. Jemand anders hat den zugrunde liegenden Ansatz für E und auch für Java portiert. (Obwohl die Java-Person verschwunden ist) (Die Spielzeuganwendungen sind Plausibilitätsprüfungen, die Ideen können in anderen Sprachen funktionieren, wenn sie als lokale Idiome umformuliert werden müssen)
Vielleicht sollte Ihre Frage nicht lauten: "Was können diese Sprachen lernen?", sondern "Was kann die Java-Community lernen, wenn sie sich anderswo umschaut?". Viele Leute, die Python lernen, sind liguistisch Immigranten aus anderen Ländern und bringen ihre Kenntnisse in anderen Sprachen mit, und so sieht es aus, als ob Python schon in anderen Sprachen nach Inspiration Ausschau hält.
Wählen Sie etwas Konkretes aus, zum Beispiel diese Anwendung zum Sprechen und Schreiben - das ist ein Werkzeug, um einem kleinen Kind das Lesen und Schreiben beizubringen Schreiben, basierend auf Stifteingabe, Handschrifterkennung und Sprachsynthesizer - verwendet mehrere Dutzend gleichzeitige Subsysteme, läuft mit einer akzeptablen Geschwindigkeit auf einer einzelnen Kernmaschine, wäre leicht auf einer Maschine mit vielen Kernen ablauffähig. Der Grund für die Anzahl der gleichzeitigen Subsysteme hat jedoch nichts damit zu tun, "die Anwendung parallel zu machen", sondern eher mit "Wie kann ich die Anwendung einfacher schreiben, erweitern und warten?". Die Tatsache, dass es peinlich parallel endet, ist ein sekundärer Bonus.
Es gibt ein vollständiges Tutorial - Pragmatische Parallelität - verlinkt von der Titelseite. (Notizen, Folien, Video- und Code-Bundle)
Das Modell kann verbessert werden, und Vorschläge sind willkommen - das Leben wäre sehr langweilig, wenn wir alle nur "aufhören" würden, bessere Werkzeuge zu machen - aber das zu ignorieren, was bereits existiert, scheint etwas ... engstirnig zu sein. Wenn das ein bisschen hart erscheint, sehen Sie sich bitte die heutige Dilbert an.
: -)
Tags und Links python ruby java multithreading concurrency