Python vs. Java - Welches Programm wählen Sie für die gleichzeitige Programmierung und warum? [geschlossen]

8

Wenn Sie nicht Python oder Java verwenden, würden Sie dann generell eine statisch typisierte oder eine dynamische Sprache wählen?

    
Setzer 07.12.2009, 17:21
quelle

11 Antworten

25

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 .

    
johnstok 07.12.2009, 17:32
quelle
11

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.

    
halfdan 07.12.2009 17:27
quelle
9

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.

    
Ben James 07.12.2009 17:32
quelle
5

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 .

    
blank 07.12.2009 17:30
quelle
4

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.

    
Peter 07.12.2009 17:27
quelle
2

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:

  • Zeit, eine (sehr) neue Technologie zu beherrschen
  • Kontrolle über einen vernünftigen Teil der Produktionskette, da Erland einige Anpassungen in Ihrer Toolbox benötigt, um
  • zu passen
e-satis 07.12.2009 17:31
quelle
2

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.

    
Matthew Sowders 07.12.2009 20:40
quelle
1

Für einige Aufgaben ist Python zu langsam. Ihr Single-Thread-Java-Programm könnte schneller sein als die gleichzeitige Version von Python auf einem Multicore-Computer ...

Ich möchte Java oder Scala, F # verwenden oder einfach zu C ++ (MPI und OpenMPI) gehen.

    
Yin Zhu 07.12.2009 17:38
quelle
1

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.

    
Dave Kirby 07.12.2009 17:54
quelle
1

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.

    
alesplin 07.12.2009 18:46
quelle
1

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 .

    
Jamie McCrindle 03.01.2010 14:52
quelle