Ich interessiere mich für das Erlernen der gleichzeitigen Programmierung, wobei ich mich auf die Anwendungs- / Benutzerebene konzentriere (nicht auf die Systemprogrammierung). Ich bin auf der Suche nach einer modernen Programmiersprache auf hohem Niveau, die intuitive Abstraktionen zum Schreiben von gleichzeitigen Anwendungen bietet. Ich möchte mich auf Sprachen konzentrieren, die die Produktivität steigern und die Komplexität der gleichzeitigen Programmierung verbergen.
Um einige Beispiele zu nennen: Ich halte es nicht für eine gute Option, Multithread-Code in C, C ++ oder Java zu schreiben, da meiner Meinung nach meine Produktivität abnimmt und das Programmiermodell nicht intuitiv ist. Andererseits sind Sprachen, die die Produktivität steigern und intuitivere Abstraktionen bieten, wie Python und das Multiprozessormodul, Erlang, Clojure, Scala usw., gute Optionen.
Was würden Sie aufgrund Ihrer Erfahrungen empfehlen und warum?
EDIT: Vielen Dank für Ihre interessanten Antworten. Es ist schwer, eine Schlussfolgerung zu ziehen, ohne es tatsächlich zu versuchen, da es viele gute Kandidaten gibt: Erlang, Clojure, Scala, Groovy und vielleicht Haskell. Ich habe die Antwort mit den überzeugendsten Argumenten gewählt, aber ich werde alle guten Kandidaten ausprobieren, bevor ich mich für einen entschieden habe :)
To give an example, I don't consider a good option writing multithreaded code in C, C++, or Java
. Warum?On the other hand, Python and the multiprocessing module, Erlang, Clojure, Scala, etc. are some of my options.
Nochmals, warum? Erweitern Sie Ihre Frage, um besser zu definieren, wonach Sie tatsächlich suchen.begin transaction
end transaction
und alles im Inneren sollte ohne Deadlocks funktionieren und entweder erfolgreich sein oder als Ganzes scheitern.Antworten:
Sie sollten sich mit ziemlicher Sicherheit Clojure ansehen - meiner Meinung nach ist es die beste moderne Sprache für Multi-Core-Programmierung und äußerst produktiv.
Hauptmerkmale:
Einige Mini-Codebeispiele mit einer Parallelitätsneigung:
Insbesondere lohnt es sich, eines oder mehrere der folgenden Videos anzusehen:
quelle
Sie könnten D. versuchen. Es bietet drei Modelle. Ich empfehle entweder die erste oder die zweite.
std.concurrency . Wenn Sie dieses Modul für alle Ihre Anforderungen an die Parallelität verwenden, erzwingt eine Kombination aus Sprache und Standardbibliothek die Isolation zwischen Threads. Threads kommunizieren hauptsächlich über die Nachrichtenübermittlung, wobei der gemeinsam genutzte Speicher nur eingeschränkt unterstützt wird, sodass die Sicherheit an erster Stelle steht und Datenrennen auf niedriger Ebene nicht zugelassen werden. Leider muss die Dokumentation von std.concurrency verbessert werden, aber das Modell ist in einem kostenlosen Kapitel von Andrei Alexandrescus Buch "The D Programming Language" dokumentiert .
Standardparallelismus . Dieses Modul wurde speziell für Multicore-Parallelität und nicht für die allgemeine Parallelität entwickelt. ( Parallelität und Parallelität sind nicht dasselbe, obwohl Parallelität erforderlich ist, um Parallelität zu implementieren. ) Da der springende Punkt der Parallelität die Leistung ist, garantiert std.parallelism keine Isolation, da sie das Schreiben von effizientem Parallelcode erschweren würden. Es werden jedoch viele fehleranfällige Details auf niedriger Ebene entfernt, so dass es sehr schwierig ist, Fehler zu beheben, wenn Sie Workloads parallelisieren, die Sie manuell überprüft haben und die voneinander unabhängig sind.
core.thread ist ein Low-Level-Wrapper für betriebssystemspezifische Threading-APIs. Sowohl std.concurrency als auch std.parallelism verwenden es unter der Haube, aber ich würde es nur empfehlen, wenn Sie Ihre eigene Parallelbibliothek schreiben oder eine lächerliche Ecke finden, die weder in std.parallelism noch in std gut gemacht werden kann .währung. Niemand sollte etwas so Niedriges für die tägliche Arbeit verwenden.
quelle
Erlang ist definitiv eine großartige Option, aber etwas Praktischeres könnte Go sein , Googles neue Sprache.
Es ist nicht so weit von anderen gebräuchlichen Sprachen entfernt, daher ist es normalerweise leicht zu bekommen, wenn Sie bereits andere "einfache" Sprachen kennen. Viele Leute vergleichen es mit Python oder sogar Lua, wenn es darum geht, wie komfortabel es ist, es zu programmieren.
quelle
Schauen Sie sich Microsofts Parallel Programming for .net an. Es ist sehr intuitiv.
quelle
Sowohl Erlang als auch Scala haben eine auf Schauspielern basierende Parallelität , die ich als sehr intuitiv und leicht erlernbar empfand.
quelle
Ich lerne gerade etwas über Haskell und das Lesen dieses Artikels hat mich überzeugt, dass Haskell eine gute Option für die gleichzeitige Programmierung ist. Da es rein funktional ist (das Typsystem weiß, ob eine Funktion Eingaben, Ausgaben oder das Lesen / Ändern des globalen Zustands ausführt), kann es Dinge wie Software-Transaktionsspeicher (im obigen Artikel sehr gut zusammengefasst) ausführen, die sich ähnlich wie Transaktionen verhalten in datenbanken bekommt man ein paar nette sachen wie atomicity mit nur ein wenig extra zucker. AFAIK, Haskell-Fäden sind auch sehr leicht. Darüber hinaus können durch die Tatsache, dass Haskell rein funktional ist, auch einfache Aufgaben mit nur einem Schlüsselwort (par) parallel ausgeführt werden. Quelle
quelle
Googles GO-Sprache bietet einige interessante Tools für den gleichzeitigen Zugriff - das wäre eine weitere unterhaltsame Sache, die Sie ausprobieren sollten. Siehe: http://golang.org/doc/effective_go.html#concurrency und lesen Sie einige Beispiele.
quelle
In der nächsten Version macht es C # noch einfacher, als das Diagramm zeigt. Es gibt zwei neue Schlüsselwörter Async und Await.
Async wird als Funktionsmodifikator verwendet und sagt: "Diese Operation führt ihre Arbeit an einem anderen Thread aus.
Await wird in einer Async-Funktion verwendet, und hier geschieht die Magie. Grundsätzlich weist Await den Compiler an, die Operation nach dem Schlüsselwort in einem separaten Thread auszuführen und auf die Ergebnisse zu warten. Jeder Code nach dem Warteaufruf wird nach der Operation ausgeführt.
AUCH die Operation wird mit dem aufrufenden Thread synchronisiert (wenn Sie also eine asynchrone Operation als Reaktion auf einen Tastenklick ausführen, müssen Sie nicht manuell zurück in den UI-Thread posten). Mit zwei kleinen Stichwörtern erhalten Sie eine Menge Parallelität. Lesen Sie hier mehr
quelle
Ich würde weiterhin C ++ empfehlen. Es ist mehr als fähig, die notwendigen Abstraktionen zu erzeugen, um anständigen gleichzeitigen Code zu schreiben. Die überwältigende Wahrscheinlichkeit ist, dass Sie einfach eine schlechte Bibliothek für die Ausführung der Aufgabe haben, da gute Bibliotheken für die Ausführung der Aufgabe relativ neu sind und das Wissen für die Verwendung von C ++ nicht gerade allgemein ist. Intels TBB gibt es erst seit ein paar Jahren, und Microsofts PPL wurde erst seit letztem Jahr ausgeliefert.
Wenn Sie so etwas wie TBB oder PPL verwenden, ist das Schreiben von gleichzeitigem Code nicht gerade trivial , sofern die gleichzeitige Verwendung nie trivial ist, sondern alles andere als mühsam. Wenn Sie pthreads oder Win32-Threads direkt verwenden, ist es kein Wunder, dass Sie es nicht mögen - Sie schreiben praktisch in Assembler mit solchen Funktionen. Aber mit der PPL sprechen Sie über standardmäßige Funktionsalgorithmen, die für Sie parallelisiert sind, generische Datenstrukturen für den gleichzeitigen Zugriff und solche guten Dinge.
quelle
std::thread
(oderstd::tr1::thread
) an. Es ist eigentlich eine sehr gute Abstraktion, IMO.boost::thread
ist nur ein OS-Wrapper mit einem kleinen RAII. PPL und TBB sind echte gleichzeitige Algorithmen, Container usw.Hier wird ein Plug für Ada benötigt, da es alle Abstraktionen der obersten Ebene für Parallelität und Parallelität enthält. sonst bekannt als tasking . Auch als OP nach intuitiven (subjektiven) Kriterien fragte, denke ich, dass ein anderer Ansatz für die Java-zentrierte Welt geschätzt werden könnte.
quelle
Ich würde Groovy / Java / GPars vorschlagen, wenn Sie JVM-basiert sein können, da es Akteure, Datenfluss, Kommunikation sequentieller Prozesse (CSP), Datenparallelität, Software-Transaktionsspeicher (STM), Agenten usw. ermöglicht Es gibt viele Modelle für Parallelität und Parallelität auf hoher Ebene, die jeweils unterschiedliche "Sweet Spots" aufweisen. Sie möchten kein Modell verwenden, das nicht mit der Lösung eines Problems übereinstimmt, das Sie erstellen möchten. Sprachen und Frameworks mit nur einem Modell zwingen Sie zum Algorithmus-Hacking.
Natürlich könnte ich als voreingenommen angesehen werden, da ich zu Groovy und GPars beitrage. Andererseits arbeite ich mit CSP und Python, vgl. Python-CSP.
Ein weiterer Punkt ist, dass es bei der ursprünglichen Frage nicht um das Schreiben eines Produktionssystems, sondern um das Lernen geht. Daher ist die Groovy / Java / GPars-Kombination eine gute Möglichkeit zum Lernen, auch wenn die spätere Produktionsarbeit in C ++ mit etwas wie Just :: Thread Pro oder TBB ausgeführt wird, anstatt auf JVM zu basieren.
(Einige absolut vernünftige URL-Links mussten entfernt werden, weil die Host-Site in Panik geriet.)
quelle
Was ist mit Clojure? Sie können Swing zum Beispiel verwenden, aber gleichzeitig mit Clojure programmieren? Clojure hat eine ziemlich gute Java-Integration.
Haben Sie auch Java 7 Fork / Join-Framework in Betracht gezogen ?
quelle
Sie können sich auch Groovy und die GPars- Bibliothek ansehen . GPars BTW ähnelt in gewisser Weise der in einer anderen Antwort erwähnten .NET Parallel Extension, wird jedoch durch die flexible Syntax von Groovys unter bestimmten Umständen besser gelesen.
quelle
Scala wurde mehrmals in den Fragen und Antworten erwähnt, aber ich habe keinen Hinweis auf Akka gesehen , eine Schauspielerimplementierung, die sowohl mit Scala als auch mit Java verwendet werden kann.
quelle
Ich denke, es hängt davon ab, was Sie bauen. Desktop-Apps oder Server? Ich habe gehört, dass node.j (ohne persönliche Erfahrung) hervorragend für die gleichzeitige Programmierung von Servern geeignet ist (sowohl in Bezug auf das Schreiben von Code als auch in Bezug auf die Leistung). Wenn ich eine neue Server-App schreiben wollte, würde ich das wahrscheinlich ausprobieren. Nicht sicher über Desktop-Anwendungen ... Ich habe eine ganze Menge Dinge in C # geschrieben und es gibt einige Tools, die die Komplexität gut verbergen, obwohl Sie in anderen Fällen direkt damit umgehen müssen.
quelle
Ich werde dafür vielleicht über den Kopf geschlagen, aber haben Sie Kapitel 7 von TAOUP gelesen ? Der Abschnitt, an den ich gerade denke, ist Themen gegen Prozesse. Ich habe festgestellt, dass das Konzept der gleichzeitigen Verarbeitung die meisten Leute an Threads erinnert, aber ich habe noch nie einen Fall gesehen, in dem ein Thread einfacher und schneller zu verwenden ist als das Erzeugen eines untergeordneten Prozesses.
Sie überlassen den Schlauen, die Ihr Betriebssystem erstellt haben, alle Details der Parallelverarbeitung. Es gibt bereits viele Kommunikationsmethoden, und Sie müssen sich keine Gedanken über das Sperren freigegebener Ressourcen machen. Threads sind grundsätzlich ein Effizienz-Hack, der der Regel der Optimierung unterliegt. Optimieren Sie nicht, wenn Sie nicht auf Notwendigkeit getestet haben.
Suchen Sie eine gute Unterprozessbibliothek, z. B. Envoy for Python . Oder Sie schreiben einfach mehrere separate Programme in C und schreiben ein anderes "Master" -Programm, um mithilfe von Fork und Pipe die Unterprozesse zu erzeugen und mit ihnen zu kommunizieren.
quelle