Heim  >  Artikel  >  Backend-Entwicklung  >  Die Unterschiede sowie Vor- und Nachteile von Threads und Prozessen in Python

Die Unterschiede sowie Vor- und Nachteile von Threads und Prozessen in Python

乌拉乌拉~
乌拉乌拉~Original
2018-08-23 17:42:402124Durchsuche

In diesem Artikel werfen wir einen Blick darauf, was Python-Threads und -Prozesse sind. Erfahren Sie mehr über Python-Threads und -Prozesse und erfahren Sie mehr über die Unterschiede sowie Vor- und Nachteile von Threads und Prozessen in Python. Wir haben Multi-Processing und Multi-Threading eingeführt, die beiden gängigsten Methoden zum Erreichen von Multitasking. Lassen Sie uns nun die Vor- und Nachteile beider Ansätze besprechen. Um Multitasking zu erreichen, entwerfen wir normalerweise das Master-Worker-Modell. Der Master ist für die Zuweisung von Aufgaben und der Worker für die Ausführung von Aufgaben verantwortlich. Normalerweise gibt es einen Master und mehrere Worker.

Wenn Sie mehrere Prozesse verwenden, um Master-Worker zu implementieren, ist der Hauptprozess der Master und andere Prozesse sind Worker.

Wenn Sie Multithreading verwenden, um Master-Worker zu implementieren, ist der Hauptthread der Master und andere Threads sind die Worker.

Der größte Vorteil des Multiprozessmodus ist seine hohe Stabilität, denn wenn ein Unterprozess abstürzt, hat dies keine Auswirkungen auf den Hauptprozess und andere Unterprozesse. (Wenn der Master-Prozess aufhängt, hängen natürlich alle Prozesse auf, aber der Master-Prozess ist nur für die Zuweisung von Aufgaben verantwortlich und die Wahrscheinlichkeit eines Aufhängens ist gering.) Der berühmte Apache hat zuerst den Multiprozessmodus übernommen.

Der Nachteil des Multiprozessmodus besteht darin, dass die Kosten für die Erstellung eines Prozesses hoch sind. Unter Unix/Linux-Systemen ist der Aufruf von Fork in Ordnung, aber die Erstellung von Prozessen unter Windows ist teuer. Darüber hinaus ist die Anzahl der Prozesse, die das Betriebssystem gleichzeitig ausführen kann, begrenzt. Wenn Tausende von Prozessen gleichzeitig ausgeführt werden, treten beim Betriebssystem sogar Planungsprobleme auf.

Der Multithread-Modus ist normalerweise etwas schneller als der Multi-Prozess, aber nicht viel schneller. Darüber hinaus besteht der fatale Nachteil des Multi-Thread-Modus darin, dass jeder hängende Thread direkt zum Absturz des gesamten Prozesses führen kann Alle Threads teilen sich den Prozessspeicher. Wenn unter Windows ein Problem mit dem von einem Thread ausgeführten Code auftritt, wird häufig die folgende Meldung angezeigt: „Das Programm hat einen illegalen Vorgang ausgeführt und wird bald geschlossen.“ Tatsächlich liegt häufig ein Problem mit einem bestimmten Thread vor , aber das Betriebssystem erzwingt das Beenden des gesamten Prozesses.

Unter Windows ist Multithreading effizienter als Multiprozess, daher übernimmt der IIS-Server von Microsoft standardmäßig den Multithreading-Modus. Aufgrund von Stabilitätsproblemen beim Multithreading ist IIS nicht so stabil wie Apache. Um dieses Problem zu lindern, verfügen IIS und Apache jetzt über einen gemischten Modus aus Multiprozess + Multithread, was das Problem wirklich immer komplizierter macht.

Thread-Wechsel

Ob Multiprozess oder Multithread, solange die Anzahl groß ist, wird die Effizienz definitiv nicht steigen. Warum?

Nehmen wir an, Sie bereiten sich leider auf die Aufnahmeprüfung für die High School vor und müssen jeden Abend Hausaufgaben in 5 Fächern machen: Chinesisch, Mathematik, Englisch, Physik und Chemie.

Wenn Sie zunächst eine Stunde damit verbringen, Chinesisch-Hausaufgaben zu machen, und dann eine Stunde damit verbringen, Mathe-Hausaufgaben zu machen, erledigen Sie sie auf diese Weise alle nacheinander, sodass Sie insgesamt 5 Stunden in Anspruch nehmen -Aufgabenmodell oder Batch-Modell Prozessaufgabenmodell.

Angenommen, Sie planen, zum Multitasking-Modell zu wechseln. Sie können zunächst 1 Minute Chinesisch lernen, dann zu Mathe-Hausaufgaben wechseln, 1 Minute erledigen, dann zu Englisch wechseln und so weiter, solange dies der Fall ist Die Schaltgeschwindigkeit ist auf diese Weise schnell genug. Es ist dasselbe wie bei einer Single-Core-CPU, die Multitasking ausführt. Aus der Sicht eines Kindergartenkindes schreiben Sie Hausaufgaben für fünf Fächer gleichzeitig.

Der Wechsel der Hausaufgaben ist jedoch mit Kosten verbunden. Wenn Sie beispielsweise von Chinesisch auf Mathematik umsteigen, müssen Sie zuerst die chinesischen Bücher und Stifte auf dem Tisch wegräumen (dies wird als Speichern der Szene bezeichnet) und dann die öffnen Lesen Sie das Mathematiklehrbuch und finden Sie Zirkel und Lineal (das nennt man „Vorbereitung auf die neue Umgebung“), bevor Sie mit den Mathe-Hausaufgaben beginnen können. Das Betriebssystem ist beim Wechseln von Prozessen oder Threads dasselbe. Es muss zuerst die aktuelle Ausführungsumgebung (CPU-Registerstatus, Speicherseiten usw.) speichern und dann die Ausführungsumgebung für die neue Aufgabe vorbereiten (den letzten Registerstatus wiederherstellen). Speicherseite wechseln usw.), bevor die Ausführung beginnen kann. Dieser Umschaltvorgang ist zwar schnell, erfordert aber auch Zeit. Wenn Tausende von Aufgaben gleichzeitig ausgeführt werden, ist das Betriebssystem möglicherweise hauptsächlich damit beschäftigt, Aufgaben zu wechseln, und es bleibt nicht viel Zeit, Aufgaben auszuführen. Die häufigste Situation in dieser Situation ist, dass die Festplatte wild piept Reaktion beim Klicken auf das Fenster, und das System befindet sich in einem angehaltenen Animationszustand.

Sobald die Anzahl der Multitasking-Aufgaben eine Grenze erreicht, werden daher alle Ressourcen des Systems verbraucht. Infolgedessen sinkt die Effizienz stark und alle Aufgaben werden nicht ordnungsgemäß erledigt.

Rechenintensiv vs. IO-intensiv

Die zweite Überlegung bei der Entscheidung, ob Sie Multitasking betreiben möchten, ist die Art der Aufgabe. Wir können Aufgaben in rechenintensive und IO-intensive Aufgaben unterteilen.

Rechenintensive Aufgaben zeichnen sich dadurch aus, dass sie eine große Menge an Berechnungen erfordern und CPU-Ressourcen verbrauchen, wie z. B. die Berechnung von Pi, die hochauflösende Dekodierung von Videos usw., die alle auf der Rechenleistung der CPU basieren. Obwohl diese Art von rechenintensiven Aufgaben auch mit Multitasking erledigt werden kann, gilt: Je mehr Aufgaben vorhanden sind, desto mehr Zeit wird für den Aufgabenwechsel aufgewendet und desto geringer ist die Effizienz der CPU bei der Ausführung von Aufgaben Nutzung der CPU, rechenintensive Aufgaben Die Anzahl der gleichzeitigen Aufgaben sollte gleich der Anzahl der CPU-Kerne sein.

Rechenintensive Aufgaben verbrauchen hauptsächlich CPU-Ressourcen, daher ist die Effizienz der Codeausführung von entscheidender Bedeutung. Skriptsprachen wie Python laufen sehr ineffizient und sind für rechenintensive Aufgaben völlig ungeeignet. Für rechenintensive Aufgaben ist es besser, in der Sprache C zu schreiben.

Die zweite Art von Aufgabe ist E/A-intensiv. Aufgaben, die Netzwerk- und Festplatten-E/A betreffen, sind alle E/A-intensive Aufgaben. Das Merkmal dieser Art von Aufgabe ist, dass der CPU-Verbrauch sehr gering ist, und zwar meistens Die Aufgabe besteht darin, auf den Abschluss des E/A-Vorgangs zu warten (da die E/A-Geschwindigkeit viel langsamer ist als die Geschwindigkeit von CPU und Speicher). Bei E/A-intensiven Aufgaben gilt: Je mehr Aufgaben, desto höher die CPU-Effizienz, es gibt jedoch eine Grenze. Bei den häufigsten Aufgaben handelt es sich um E/A-intensive Aufgaben, beispielsweise Webanwendungen.

Während der Ausführung von E/A-intensiven Aufgaben werden 99 % der Zeit für E/A aufgewendet, und nur sehr wenig Zeit wird für die CPU aufgewendet. Ersetzen Sie daher Python durch eine extrem schnell laufende C-Sprache, die extrem langsam läuft Die Skriptsprache kann die Betriebseffizienz überhaupt nicht verbessern. Für IO-intensive Aufgaben ist die Sprache mit der höchsten Entwicklungseffizienz am besten geeignet (die Skriptsprache ist die erste Wahl und die Sprache C ist die schlechteste).

Asynchrone E/A

Angesichts des großen Geschwindigkeitsunterschieds zwischen CPU und E/A verbringt eine Aufgabe die meiste Zeit damit, während der Ausführung auf E/A-Vorgänge zu warten Da Aufgaben nicht parallel ausgeführt werden können, benötigen wir ein Multiprozessmodell oder ein Multithread-Modell, um die gleichzeitige Ausführung mehrerer Aufgaben zu unterstützen.

Moderne Betriebssysteme haben enorme Verbesserungen bei E/A-Vorgängen vorgenommen. Das größte Merkmal ist, dass sie asynchrone E/A unterstützen. Wenn Sie die vom Betriebssystem bereitgestellte asynchrone E/A-Unterstützung vollständig nutzen, können Sie ein Einzelprozess-Single-Thread-Modell verwenden, um mehrere Aufgaben auszuführen. Dieses neue Modell wird als ereignisgesteuertes Modell bezeichnet Asynchrone E/A läuft auf einer Single-Core-CPU und kann Multitasking effizient unterstützen. Auf einer Multi-Core-CPU können Sie mehrere Prozesse ausführen (die Anzahl entspricht der Anzahl der CPU-Kerne) und so die Vorteile der Multi-Core-CPU voll ausnutzen. Da die Gesamtzahl der Prozesse im System sehr begrenzt ist, ist die Betriebssystemplanung sehr effizient. Die Verwendung des asynchronen IO-Programmiermodells zur Implementierung von Multitasking ist ein wichtiger Trend.

Entsprechend der Python-Sprache wird das Single-Threaded-asynchrone Programmiermodell als Coroutine bezeichnet. Mit der Unterstützung von Coroutine können effiziente Multitasking-Programme ereignisgesteuert geschrieben werden.

Das Obige ist der gesamte Inhalt dieses Artikels. In diesem Artikel werden hauptsächlich die Unterschiede sowie die Vor- und Nachteile von Threads und Prozessen in Python vorgestellt . Inhalt. Ich hoffe, dass das, was ich in diesem Artikel beschrieben habe, für Sie hilfreich ist und Ihnen das Erlernen von Python erleichtert.

Weitere Informationen zu diesem Thema finden Sie in der Spalte Python-Tutorial auf der chinesischen PHP-Website.

Das obige ist der detaillierte Inhalt vonDie Unterschiede sowie Vor- und Nachteile von Threads und Prozessen in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn