Heim > Artikel > Backend-Entwicklung > Python-Entwicklung – detaillierte Erklärung von Prozessen, Threads und Coroutinen
Ein Programm kann nicht alleine ausgeführt werden. Nur wenn das Programm in den Speicher geladen wird und das System ihm Ressourcen zuweist, wird es als Prozess bezeichnet. Der Unterschied zwischen einem Programm und einem Prozess besteht darin, dass ein Programm eine Sammlung von Anweisungen ist, bei denen es sich um einen statischen Beschreibungstext des Prozesses handelt. Ein Prozess ist eine Ausführungsaktivität des Programms und ein dynamisches Konzept.
Thread ist die kleinste Einheit, mit der das Betriebssystem die Betriebsplanung durchführen kann. Es wird in den Prozess eingebunden und ist die eigentliche Bedieneinheit im Prozess. Ein Thread bezieht sich auf einen einzelnen sequenziellen Kontrollfluss in einem Prozess. In einem Prozess können mehrere Threads gleichzeitig ausgeführt werden, und jeder Thread führt parallel unterschiedliche Aufgaben aus.
Threads teilen sich den Speicherplatz und der Speicher des Prozesses ist unabhängig.
Threads desselben Prozesses können direkt miteinander kommunizieren, zwei Prozesse müssen jedoch über einen Zwischenagenten miteinander kommunizieren.
Das Erstellen eines neuen Threads ist sehr einfach. Das Erstellen eines neuen Prozesses erfordert das Klonen seines übergeordneten Prozesses.
Ein Thread kann andere Threads im selben Prozess steuern und betreiben, aber ein Prozess kann nur untergeordnete Prozesse betreiben.
Egal wie viele Threads geöffnet sind und wie viele CPUs vorhanden sind, Python lässt bei der Ausführung nur einen Thread gleichzeitig zu.
Die Funktion von Join besteht darin, den Hauptprozess zu blockieren und das Programm nach dem Join nicht mehr ausführen zu können.
Bei Multithreads und mehreren Joins werden die Join-Methoden jedes Threads nacheinander ausgeführt. Die Ausführung des vorherigen Threads ist abgeschlossen, bevor der nachfolgende Thread ausgeführt werden kann.
Wenn keine Parameter vorhanden sind, warten Sie, bis der Thread beendet ist, bevor Sie nachfolgende Programme ausführen.
Warten Sie nach dem Festlegen der Parameter auf die vom Thread festgelegte Zeit und führen Sie dann den nachfolgenden Hauptprozess aus, unabhängig davon, ob der Thread endet.
设置参数效果如下:
默认情况下,主线程在退出时会等待所有子线程的结束。如果希望主线程不等待子线程,而是在退出时自动结束所有的子线程,就需要设置子线程为后台线程(daemon)。方法是通过调用线程类的setDaemon()方法。
Mehrere Threads können unter einem Prozess gestartet werden, und mehrere Threads teilen sich den Speicherplatz des übergeordneten Prozesses. Dies bedeutet, dass jeder Thread auf dieselben Daten zugreifen kann. Wenn zwei Threads gleichzeitig dieselben Daten ändern möchten, ist eine Thread-Sperre erforderlich.
Gesperrte Version
Lock verhindert, dass andere Threads den Ressourcenzugriff teilen , und derselbe Thread kann nur einmal akquirieren, wenn mehr als einmal ein Deadlock auftritt und das Programm nicht weiter ausgeführt werden kann.
GIL garantiert, dass nur ein Thread gleichzeitig ausgeführt werden kann. Lock ist eine Sperre auf Benutzerebene und hat nichts mit GIL zu tun.
Rlock darf mehrmals im selben Thread erworben werden. Die Freigabe gemeinsam genutzter Ressourcen durch einen Thread erfordert die Freigabe aller Schlösser. Das heißt, n-maliges Erfassen erfordert n-maliges Freigeben.
这两种锁的主要区别是,RLock允许在同一线程中被多次acquire。 „Sperren却不允许这种情况.注意, 如果使用RLock, 那么acquire和release必须成对出现, 即调用了n次acquire, 必须调用n次的release才能真正释放所占用的锁.
互斥锁同时只允许一个线程更改数据,而Semaphore是同时允许一定数量的线程更改数据, 比如售票处有3个窗口, 那最多只允许3个人同时买票" >
Timer ruft eine Funktion in einem bestimmten Intervall auf Wenn Sie ab und zu eine Funktion aufrufen möchten, müssen Sie den Timer in der vom Timer aufgerufenen Funktion erneut festlegen. Timer ist eine abgeleitete Klasse von Thread.
Python stellt das Event-Objekt für die Kommunikation zwischen Threads bereit, das über Thread-Einstellungen verfügt Das Signalflag ist falsch. Der Thread wartet darauf, dass das Befehlssignal von anderen Threads auf wahr gesetzt wird. Das Event-Objekt implementiert einen einfachen Thread-Kommunikationsmechanismus. Es stellt Einstellungssignale, Löschsignale, Wartesignale usw. bereit, um die Kommunikation zwischen Threads zu realisieren.
Verwenden Sie die set()-Methode von Event, um das Signalflag im Event-Objekt auf true zu setzen. Das Event-Objekt stellt die Methode isSet() bereit, um den Status seines internen Signalflags zu bestimmen. Wenn die Methode set() des Event-Objekts verwendet wird, gibt die Methode isSet() true zurück.
Verwenden Sie die Methode „clear()“ von Event, um das Signalflag im Event-Objekt zu löschen, d. h. auf zu setzen Bei Verwendung der Methode „clear()“ von After Event gibt die Methode „isSet()“ „false“ zurück.
Die Methode wait() des Ereignisses wird nur dann schnell ausgeführt und schließt die Rückgabe ab, wenn das interne Signal wahr ist. Wenn das interne Signalflag des Event-Objekts „false“ ist, wartet die Methode „wait()“ darauf, dass es „true“ ist, bevor sie zurückkehrt.
Verwenden Sie Event, um die Interaktion zwischen zwei oder mehr Threads zu realisieren. Nehmen wir die Ampel als Beispiel. Das heißt, wir starten einen Thread, der als Ampel fungiert, und generieren mehrere Threads, die als Vehikel fungieren Fahrzeuge werden nach der Rot-Grün-Regel angehalten.
Warteschlangen sind in Python die am häufigsten verwendete Form des Datenaustauschs zwischen Threads. Das Warteschlangenmodul ist ein Modul, das Warteschlangenoperationen bereitstellt.
Die Klasse queue.Queue ist eine synchrone Implementierung einer Warteschlange. Die Warteschlangenlänge kann unbegrenzt oder begrenzt sein. Die Warteschlangenlänge kann über den optionalen Parameter maxsize des Warteschlangenkonstruktors festgelegt werden. Wenn maxsize kleiner als 1 ist, ist die Warteschlangenlänge unbegrenzt.
Rufen Sie die put()-Methode des Warteschlangenobjekts auf, um ein Element am Ende der Warteschlange einzufügen. put() verfügt über zwei Parameter. Das erste Element ist der Wert des eingefügten Elements. Der zweite Block ist ein optionaler Parameter und hat den Standardwert 1. Wenn die Warteschlange derzeit leer ist und der Block 1 ist, bewirkt die Methode put(), dass der aufrufende Thread anhält, bis eine Dateneinheit freigegeben wird. Wenn block 0 ist, löst die put()-Methode eine Full-Ausnahme aus.
Durch Aufrufen der get()-Methode des Warteschlangenobjekts wird ein Element vom Kopf der Warteschlange entfernt und zurückgegeben. Der optionale Parameter ist block, der standardmäßig True ist. Wenn die Warteschlange leer ist und der Block „True“ ist, bewirkt get(), dass der aufrufende Thread anhält, bis ein Element verfügbar wird. Wenn die Warteschlange leer ist und der Block den Wert False hat, löst die Warteschlange eine Empty-Ausnahme aus.
Die Verwendung der Produzenten- und Konsumentenmuster in der Entwicklung und Programmierung kann die meisten Parallelitätsprobleme lösen. Dieser Modus verbessert die Gesamtdatenverarbeitungsgeschwindigkeit des Programms, indem er die Arbeitsfunktionen des Produktionsthreads und des Verbraucherthreads ausgleicht.
In der Thread-Welt ist der Producer der Thread, der Daten produziert, und der Consumer ist der Thread, der Daten verbraucht. Wenn bei der Multithread-Entwicklung die Verarbeitungsgeschwindigkeit des Produzenten sehr hoch und die Verarbeitungsgeschwindigkeit des Konsumenten sehr langsam ist, muss der Produzent warten, bis der Konsument die Verarbeitung abgeschlossen hat, bevor er mit der Datenproduktion fortfahren kann. Wenn die Verarbeitungsleistung des Verbrauchers größer ist als die des Produzenten, muss der Verbraucher auf die gleiche Weise auf den Produzenten warten. Um dieses Problem zu lösen, wurden die Produzenten- und Konsumentenmodelle eingeführt.
Das Produzenten-Konsumenten-Muster verwendet einen Container, um das Problem der starken Kopplung zwischen Produzenten und Konsumenten zu lösen. Produzenten und Konsumenten kommunizieren nicht direkt miteinander, sondern über Blockierungswarteschlangen. Daher wartet der Produzent nicht mehr darauf, dass der Konsument sie verarbeitet, sondern wirft sie direkt in die Blockierungswarteschlange Bitten Sie den Produzenten um Daten, aber nehmen Sie sie direkt aus der Blockierungswarteschlange. Die Blockierungswarteschlange entspricht einem Puffer und gleicht die Verarbeitungskapazitäten von Produzenten und Verbrauchern aus.
Das grundlegendste Beispiel des Produzenten-Konsumenten-Modells.
Das obige ist der detaillierte Inhalt vonPython-Entwicklung – detaillierte Erklärung von Prozessen, Threads und Coroutinen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!