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
Antworten:
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:
threading
Modul ein Multithread-Programm und führen Sie es in der IronPython- oder Jython-Laufzeit aus.processing
Modul (jetzt in Python 2.6 als multiprocessing
Modul enthalten), um Ihren Code in mehreren Prozessen gleichzeitig auszuführen.subprocess
Modul, um mehrere Python-Interpreter auszuführen und zwischen ihnen zu kommunizieren.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.
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.
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:
Sie können über Multithreading in Python und Threading im Allgemeinen lesen
Multithreading in Python: http://www.devshed.com/c/a/Python/Basic-Threading-in-Python/
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.
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.
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.