Verständnis von Threads und Coroutinen in PHP
1. Threads werden auch als Lightweight-Prozess bezeichnet. Dies ist eine grundlegende CPU-Ausführungseinheit und die kleinste Einheit bei der Programmausführung. Sie besteht aus Thread-ID, Programmzähler, Registersatz und Stapel. Die Einführung von Threads reduziert den Overhead der gleichzeitigen Ausführung von Programmen und verbessert die Parallelitätsleistung des Betriebssystems. Threads verfügen über keine eigenen Systemressourcen.
Der Vorteil von Threads gegenüber Prozessen besteht darin, dass sie schneller sind, unabhängig davon, ob sie einen Thread erstellen oder einen Thread beenden von Prozessen.
Das Aufkommen von Threads besteht darin, den Verbrauch von Kontextwechseln zu reduzieren, die Parallelität des Systems zu verbessern und den Fehler zu überwinden, dass ein Prozess nur eine Sache tun kann, wodurch prozessinterne Parallelität möglich wird.
2. Coroutine
Coroutine ist ein Benutzermodus-Thread. Um zu verstehen, was ein „Benutzermodus-Thread“ ist „Kernel-Status-Thread“. Kernel-Status-Threads werden vom Betriebssystem geplant. Beim Wechseln des Thread-Kontexts müssen Sie zunächst den Kontext des vorherigen Threads speichern und dann den nächsten Thread ausführen. Wenn die Bedingungen erfüllt sind, wechseln Sie zum vorherigen Thread zurück und stellen den Kontext wieder her. Das Gleiche gilt für Coroutinen, mit der Ausnahme, dass Benutzermodus-Threads nicht vom Betriebssystem, sondern von Programmierern im Benutzermodus geplant werden.
yield
Vor dem Aufkommen von Coroutinen muss Multitasking-Parallelität erreicht werden. Im Zeitalter ohne Betriebssystem (Betriebssystem) muss die Idee von Zustandsmaschinen können zum Implementieren von Multitasking verwendet werden. Zerlegen und führen Sie mehrere Aufgaben in einer Einzelprozessumgebung aus. Dieser Modus erfordert jedoch, dass Entwickler ein klares Verständnis jeder Aufgabe haben und aufgabenbezogene Funktionen entwickeln müssen (z. B. Kommunikation zwischen Aufgaben) selbst erledigen. Später erschien das Betriebssystem (OS) und wir begannen, die vom Betriebssystem bereitgestellten Prozess- und Threadfunktionen zu verwenden, um Multitasking einfach zu erreichen. Im Betriebssystem wird der Prozesskontextwechsel vom Betriebssystemkernel gesteuert. Doch dann trat ein Problem auf. Häufiger Prozesskontextwechsel führte zu einer Verschlechterung der Betriebssystemleistung (hauptsächlich kurzfristige Ausführung von kostengünstigen Aufgabenprozessen).
Um dieses Problem zu lösen, wurde ein neues Konzept vorgeschlagen, das darin besteht, mehrere Aufgaben im selben Prozess oder Thread auszuführen. Dieses Problem entspricht einer Rückkehr zur frühen Multitasking-Implementierung im Betriebssystem -freie Ära. Und jetzt heißt die Lösung Coroutinen. Sein Kern besteht darin, einen Teil der Aufgabenumschaltung vom Kernel auf die Anwendungsschicht zu übertragen.
Um Coroutinen zu implementieren, bietet PHP zwei neue Dinge: Generatoren und Yield-Schlüsselwörter.
(1)Was ist ein Generator?Der Generator erbt und implementiert den Iterator, der der Funktionsdefinition im PHP-Code ähnelt, aber intern das Schlüsselwort yield verwendet, wie zum Beispiel:
Wenn es verwendet wird, sieht es so aus:
Okay, was bedeutet es, es so zu verwenden?
(1) Zuerst $my_gen = gen(); dieser Code instanziiert nur einen neuen Generator, der Code darin wird nicht ausgeführt (2) $my_gen->current(); gen1“ in Schritt 2 im Generator. Zu diesem Zeitpunkt wird der Code unterbrochen und die Zeichenfolge „gen1“ wird an den Generator $my_gen übergeben und als Rückgabewert der Funktion current() verwendet;
If Wenn Sie hier weiterhin die Methode current() zum Aufrufen verwenden, ändert sich das Ergebnis nicht. Der Rückgabewert von $my_gen ist immer noch gen1
(3) Nach der Ausführung von send("main send") wird die Zeichenfolge „main send“ angezeigt " ist Der Generator $my_gen wird übergeben und der Generator wird in Schritt 2 als Rückgabewert von yield an ret übergeben; über die send()-Methode wird der vorherige Kontext gefunden und nach unten fortgesetzt.
(4) Nachdem der Generator Schritt 3 ausgeführt hat und auf Schritt 4 stößt, tritt er erneut in den Interrupt ein, wenn Yield auftritt.
Der obige Inhalt dient nur als Referenz!
Empfohlenes Tutorial:
PHP-Video-TutorialDas obige ist der detaillierte Inhalt vonWie man PHP-Thread-Coroutine versteht. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!