Ich würde die JVM über Python wählen, hauptsächlich weil Multithreading in Python durch die globale Interpreter-Sperre behindert wird. Java ist jedoch wahrscheinlich nicht optimal, wenn Sie auf der JVM laufen. Clojure oder Scala (mit Schauspielern) sind beide sind wahrscheinlich besser für Multithread-Probleme geeignet.
Wenn Sie Java wählen, sollten Sie in Betracht ziehen, java.util zu verwenden. gleichzeitige Bibliotheken und vermeiden Sie Multi-Threading-Primitive wie synchronisiert .
Definitiv Stackless Python ! Das ist eine Python-Variante speziell für den Parallelbetrieb.
Aber am Ende kommt es auf Ihre Zielplattform an und darauf, was Sie erreichen wollen.
Für Parallelität würde ich Java verwenden. Mit Java meine ich eigentlich Scala , was sehr viel von Erlangs Parallelitätskonstrukten ableitet, aber (wahrscheinlich) für einen zugänglicher ist Java-Entwickler, der noch nie zuvor verwendet hat.
Python-Threads leiden unter dem Warten auf die globale Interpreter-Sperre, wodurch echte Gleichzeitigkeit (innerhalb eines einzelnen Prozesses) für CPU-gebundene Programme unerreichbar ist. Wie ich es verstehe, löst Stackless Python einige (wenn auch nicht alle) CPython-Parallelitätsmängel, aber da ich es nicht benutzt habe, kann ich nicht wirklich darauf hinweisen.
Ich glaube nicht, dass es sich bei dem Argument um Sprachwahl oder statische oder dynamische Typisierung handelt - es liegt zwischen zwei Modellen der Parallelität - gemeinsam genutztem Speicher und Nachrichtenübergabe. Welches Modell macht mehr Sinn in Ihrer Situation & amp; Erlaubt es Ihnen Ihre gewählte Sprache, eine Entscheidung zu treffen, oder sind Sie gezwungen, ein Modell gegenüber dem anderen zu übernehmen?
Sehen Sie sich doch einmal Erlang an (mit dynamischer Typisierung) und Nachrichtenübergabe , das Akteursmodell , und lesen Sie warum Joe Armstrong mag Shared Memory nicht . Es gibt auch eine interessante Diskussion über Java-Parallelität mit Locks und Threads hier auf SO .
Ich weiß nichts über Python, aber Java hat zusammen mit dem eingebauten Locks- und Threads-Modell ein Mesasge-Passing-Framework namens Kilim .
Wenn nicht Java / Python, würde ich mich für eine funktionale Sprache entscheiden, da die Berücksichtigung von Nebenwirkungen eine der Komplexitäten des Schreibens gleichzeitiger Software ist. (Soweit es Ihre Frage betrifft: diese ist zufällig statisch getippt, aber der Compiler hat die meiste Zeit ausgeführt)
Ich persönlich würde F # wählen, da ich viele schöne Beispiele dafür gesehen habe, wie man gleichzeitig Software mit Leichtigkeit schreiben kann.
Zur Einführung: Dieser Mann ist genauso lustig wie inspirierend Ein muss gesehen haben, wenn Sie sich nicht für F # was auch immer interessieren.
Ich würde Java über Jython benutzen. Java hat starke Thread-Fähigkeiten und es kann mit der Python-Syntax mit Jython geschrieben werden, so dass Sie die beste der beiden Welten haben.
Python selbst ist nicht wirklich gut mit Nebenläufigkeit und ist sowieso langsamer als Java.
Aber wenn Sie Nebenläufigkeitsprobleme und freie Hände haben, würde ich Erlang anschauen, weil es ein Design für solche Probleme war. Natürlich müssen Sie Erlang nur berücksichtigen, wenn Sie:
Weder. Concurrent-Programmierung ist bekanntlich schwer zu korrigieren. Es gibt die Möglichkeit, eine prozessorientierte Programmiersprache wie occam-pi zu verwenden, die auf der Idee basiert von sequentiellen Prozessen kommunizieren und dem Pi-Kalkül . Dies ermöglicht die Überprüfung der Kompilierungszeit auf Deadlock und viele andere Probleme, die während der gleichzeitigen Systementwicklung auftreten. Wenn du occam-pi nicht magst, was ich dir nicht vorwerfen kann, wenn du es nicht tust, könntest du Go ausprobieren neue Sprache von Google, die auch eine Version von CSP implementiert.
Die Java-Umgebung (JVM + -Bibliotheken) ist besser für Parallelität als (C) Python, aber Java ist die Sprache, die saugt. Ich würde wahrscheinlich mit einer anderen Sprache auf der JVM gehen - Jython wurde bereits erwähnt, und Clojure und Scala haben beide ausgezeichnete Unterstützung für Nebenläufigkeit.
Clojure ist besonders gut - es unterstützt persistente Datenstrukturen, Agenten und Software-Transaktionsspeicher. Es ist eine dynamische Sprache, aber Sie können ihm Typhinweisen geben, um Leistung so gut wie Java zu erhalten.
Sehen Sie dieses Video auf InfoQ von Richard Hickey (Schöpfer von Clojure) auf der Probleme mit herkömmlichen Zugängen zur Nebenläufigkeit und wie Clojure damit umgeht.
Ich würde auf Objective-C und das Foundation Framework schauen. Asynchrone, gleichzeitige Programmierung ist gut vorgesehen.
Dies hängt natürlich von Ihrem Zugriff auf Apples Developer Tools oder GnuStep ab, aber wenn Sie Zugang zu einem haben, ist es ein guter Weg, um mit gleichzeitiger Programmierung zu beginnen.
Die Antwort ist, dass es abhängt. Versuchen Sie zum Beispiel, mehrere Cores oder CPUs auf einer einzelnen Maschine zu nutzen oder möchten Sie Ihre Aufgabe auf viele Maschinen verteilen? Wie wichtig ist Geschwindigkeit gegenüber einfacher Implementierung?
Wie bereits erwähnt, hat Python den Global Interpreter Lock, aber Sie könnten das Multiprocessing -Modul verwenden. Beachten Sie, dass obwohl Stackless sehr cool ist, es verwendet nicht mehrere Kerne allein. Python wird normalerweise als einfacher angesehen als Java. Wenn Geschwindigkeit eine Priorität ist, ist Java normalerweise schneller.
Die Bibliothek java.util.concurrent
in Java vereinfacht das Schreiben gleichzeitiger Anwendungen auf einem einzelnen Computer, aber Sie müssen immer noch um jeden freigegebenen Zustand herum synchronisieren. Obwohl Java nicht unbedingt die beste Sprache für Parallelität ist, gibt es viele Tools, Bibliotheken, Dokumentationen und Best Practices, die helfen können.
Die Verwendung von Nachrichtenübergabe und -unveränderlichkeit anstelle von Threads und des gemeinsamen Status wird als der bessere Ansatz zum Programmieren gleichzeitiger Anwendungen angesehen. Funktionale Sprachen, die von Mutabilität und Nebenwirkungen abhalten, werden daher häufig bevorzugt. Wenn das Verteilen von gleichzeitigen Anwendungen über mehrere Maschinen hinweg erforderlich ist, lohnt es sich, Laufzeiten zu betrachten, die dafür ausgelegt sind, z. Erlang oder Scala Actors .
Tags und Links python java concurrency python-stackless