Unterstützt Python Multiprozessor- / Multicore-Programmierung?

69

Was ist der Unterschied zwischen Multiprozessor-Programmierung und Multicore-Programmierung? Zeigen Sie vorzugsweise Beispiele in Python, wie Sie ein kleines Programm für Multiprogramming und Multicore-Programmierung schreiben

gath
quelle

Antworten:

96

Es gibt keine "Multiprozessor" - oder "Multicore" -Programmierung. Die Unterscheidung zwischen "Multiprozessor" - und "Multicore" -Computern ist für Sie als Anwendungsprogrammierer wahrscheinlich nicht relevant. Es hat mit Feinheiten zu tun, wie die Kerne den Zugriff auf den Speicher gemeinsam nutzen.

Um einen Multicore- (oder Multiprozessor-) Computer nutzen zu können, benötigen Sie ein Programm, das so geschrieben ist, dass es parallel ausgeführt werden kann, und eine Laufzeit, mit der das Programm tatsächlich parallel auf mehreren Kernen (und) ausgeführt werden kann Betriebssystem, obwohl jedes Betriebssystem, das Sie auf Ihrem PC ausführen können, dies tut). Dies ist wirklich eine parallele Programmierung, obwohl es unterschiedliche Ansätze für die parallele Programmierung gibt. Diejenigen, die für Python relevant sind, sind Multiprocessing und Multithreading.

In Sprachen wie C, C ++, Java und C # können Sie parallele Programme schreiben, indem Sie mehrere Threads ausführen. Die globale Interpretersperre in den CPython- und PyPy-Laufzeiten schließt diese Option aus. aber nur für diese Laufzeiten. (Meiner persönlichen Meinung nach ist Multithreading gefährlich und knifflig und es ist im Allgemeinen gut, dass Python Sie dazu ermutigt, es nicht als einen Weg zu betrachten, um einen Leistungsvorteil zu erzielen.)

Wenn Sie ein paralleles Programm schreiben möchten, das in Python auf mehreren Kernen ausgeführt werden kann, haben Sie verschiedene Möglichkeiten:

  • Schreiben Sie mit dem threadingModul ein Multithread-Programm und führen Sie es in der IronPython- oder Jython-Laufzeit aus.
  • Verwenden Sie das processingModul (jetzt in Python 2.6 als multiprocessingModul enthalten), um Ihren Code in mehreren Prozessen gleichzeitig auszuführen.
  • Verwenden Sie das subprocessModul, um mehrere Python-Interpreter auszuführen und zwischen ihnen zu kommunizieren.
  • Verwenden Sie Twisted und Ampulle . Dies hat den Vorteil, dass Sie Ihren Code nicht nur über verschiedene Prozesse hinweg ausführen, sondern (wenn Sie den Zugriff auf Dateien nicht gemeinsam nutzen) möglicherweise auch über verschiedene Computer hinweg.

Unabhängig davon, für welche dieser Optionen Sie sich entscheiden, müssen Sie wissen, wie Sie die Arbeit Ihres Programms in Abschnitte aufteilen, deren Trennung sinnvoll ist. Da ich nicht sicher bin, welche Art von Programmen Sie schreiben möchten, ist es schwierig, ein nützliches Beispiel zu liefern.

Glyphe
quelle
3
Es gibt keine "Multiprozessor" - oder "Multicore" -Programmierung - sicher. Bei der Multicore- Programmierung werden Anwendungen geschrieben, die mehrere Kerne nutzen.
Johndodo
1
Im Gegensatz zu Anwendungen, die mehrere Prozessoren nutzen?
Glyphe
8
Das sind Multiprozessor-Anwendungen ... Ich bin mir nicht sicher, ob ich den Punkt verstanden habe. Ich wollte folgendes sagen: Die meisten Leute verstehen, was die Begriffe "Multicore-Programmierung" und "Multiprozessor-Programmierung" bedeuten. Die Frage des OP könnte also übersetzt werden in "Ist es möglich, Programme zu schreiben, die auf mehreren Kernen / Prozessoren in Python ausgeführt werden?" Die Begriffe, die Sie sagen, sind nicht gültig - nun, sie sind es. Das ist alles, was ich hinzufügen wollte.
Johndodo
2
Entschuldigung, aber ich muss Ihrer Thread-Meinung nicht zustimmen. Die gute Verwendung von Threads erfordert ein wenig Nachdenken und ein angemessenes Design, aber wir sollten Programmierer sein, die wissen, wie man denkt und Probleme löst. Ja, es ist möglich, sie schlecht zu verwenden, aber das gilt auch für fast alles, was wir tun. Warum ein Tool ignorieren, nur weil es Gedanken erfordert, es zu verwenden? Mehrere Prozesse sind einfach nicht gleich. Es gibt Overhead zum Einrichten / Herunterfahren, Speicherverschwendung, Kommunikations-Overhead und viel Glück, wenn Sie ein Objekt verwenden möchten, das nicht eingelegt werden kann. Oh, das stimmt, gestalten Sie Ihre App einfach um die Einschränkungen herum
Basic
6
Es ist nicht so, dass Threading Gedanken erfordert , um verwendet zu werden; Natürlich erfordert jede Programmierung Gedanken. Das Problem mit Threads besteht darin, dass sie sich ihrer Präsenz in jeder einzelnen Codezeile ständig bewusst sein müssen . Wenn Sie dagegen mit Nachrichtenübermittlung programmieren, können Sie alle externen Systeme vergessen, bis Ihre Funktion abgeschlossen ist und es Zeit ist, die nächste Nachricht zu empfangen. Multithread-Programmierung mit gemeinsamem veränderlichem Zustand erzeugt für den Programmierer eine konstante, lähmende Angst oder für den Benutzer einen konstanten Strom von unmöglich zu reproduzierenden.
Glyphe
24

Wie in einem anderen Beitrag erwähnt, verfügt Python 2.6 über das Multiprocessing- Modul, das mehrere Kerne / Prozessoren nutzen kann (es umgeht GIL, indem mehrere Prozesse transparent gestartet werden). Es bietet einige Grundelemente, die dem Threading-Modul ähnlich sind. Auf den Dokumentationsseiten finden Sie einige (einfache) Anwendungsbeispiele.

rslite
quelle
Diese Art von Antworten ist überraschend, da Prozesse ihre Adressräume nicht gemeinsam nutzen, was zu einem wesentlich anderen Programmiermodell führt.
Alex Kreimer
Es gibt eine kleine und klar erläuterte Anleitung
Chris McCowan
5

Sie können tatsächlich Programme schreiben, die mehrere Prozessoren verwenden. Sie können dies aufgrund der GIL-Sperre nicht mit Threads tun, aber Sie können es mit einem anderen Prozess tun. Entweder:

Mapad
quelle
1
Threads und Python werden auf mehrere Kerne aufgeteilt, aber einige dieser Kerne (alle bis auf einen, es sei denn, Sie zaubern in C) warten nur auf die GIL. Aus diesem Grund arbeiten CPU-gebundene Threads vor Python 3.2 auf Single-Core-Computern besser als auf Multicore-Computern.
Chad
1
Einige Module sind in C implementiert und geben die GIL frei. Das zlib-Modul (auch vom gzip-Modul verwendet) ist eines davon. Sie können mehrere Kerne verwenden, um Daten mithilfe mehrerer Threads in Python zu dekomprimieren oder zu komprimieren. Andere Beispiele existieren in der Standardbibliothek (Bibliothek für reguläre Ausdrücke) und einigen anderen Bibliotheken von Drittanbietern, wie z. B. net-snmp.
Will Pierce
@ WillPierce Das lautet wie folgt: "Es ist möglich und sehr gut, aber nur, wenn Sie Python nicht verwenden." Ich kann ein C-Modul für fast jede Sprache schreiben. Das ist ein Plus für C, hebt aber nur die Fehler von Python hervor.
Basic
2

Wenn ich die Dinge richtig verstehe, hat Python die sogenannte GIL (Global Interpreter Lock), die es effektiv unmöglich macht, Multicores zu nutzen, wenn mehrere Threads in Python ausgeführt werden.

Siehe zB Guido van Rossums Blogeintrag zum Thema. Soweit ich weiß, unterstützen unter den "Mainstream" -Sprachen nur C / C ++ und Java Multicores effektiv.

Lindelof
quelle
1
Die globale Interpreter-Sperre ist ebenfalls nur ein CPython-Problem. Jython und IronPython verwenden das Threading-System ihrer Laufzeit.
VolkA
Jython ist jedoch langsamer als CPython. IronPython ist genauso schnell.
Blaisorblade
@ 1800INFORMATION nicht! Nur Windows-Benutzer / Entwickler verwenden es VIEL, aber es ist nicht der Fall bei C / C ++ und Java. Zeitraum
Alles ist gut 18.
@ Martin gut, ich weiß nicht, was Sie dann mit Mainstream meinen, aber es ist sehr beliebt
1800 INFORMATION
1

Der Hauptunterschied besteht darin, wie Sie Daten organisieren und verteilen. Multicore hat typischerweise höhere Bandbreiten zwischen den verschiedenen Kernen in einer CPU, und Multiprozessor muss den Bus zwischen den CPUs stärker einbeziehen.

Python 2.6 hat Multiprozess (Prozess, wie beim Ausführen eines Programms) und mehr Synchronisations- und Kommunikationsobjekte für die Multithread-Programmierung erhalten.

Lasse V. Karlsen
quelle
0

Wenn Sie nicht über Python 2.6 verfügen (was Sie beispielsweise nicht tun, wenn Sie Ubuntu Edgy oder Intrepid verwenden), können Sie die von Google Code zurückportierte Version der Mehrfachverarbeitung verwenden. Es ist Teil von PyPI, was bedeutet, dass Sie es einfach mit EasyInstall (das Teil des Python-Setuptools-Pakets in Ubuntu ist) installieren können.

Gert
quelle