Heim >Backend-Entwicklung >PHP-Problem >Was bedeutet PHP-Coroutine?
Was bedeutet PHP-Coroutine?
PHP-Coroutinen sind äquivalent zu Threads. Wenn Sie den Thread-Kontext wechseln, müssen Sie zuerst den Kontext des vorherigen Threads speichern und dann den nächsten Thread ausführen, wenn die Bedingungen erfüllt sind Zum vorherigen Thread zurückkehren und den Kontext wiederherstellen. Das Gleiche gilt für Coroutinen, mit der Ausnahme, dass Coroutinen vom Benutzer geplant werden, während Threads vom System geplant werden.
PHP-Coroutine-Nutzung
Coroutine-Unterstützung basiert auf dem iterativen Generator und fügt die Funktion hinzu, Daten zurück an den Generator zu senden (der Aufrufer sendet Daten an die aufgerufene Generatorfunktion). ). Dadurch wird die unidirektionale Kommunikation vom Generator zum Aufrufer in eine bidirektionale Kommunikation zwischen den beiden umgewandelt.
Die Funktion der Datenübergabe erfolgt über die send()-Methode des Iterators Die Coroutine logger() ist ein Beispiel dafür, wie diese Kommunikation funktioniert:
<?php function logger($fileName) { $fileHandle = fopen($fileName, 'a'); while (true) { fwrite($fileHandle, yield . "\n"); } } $logger = logger(__DIR__ . '/log'); $logger->send('Foo'); $logger->send('Bar') ?>
Wie Sie sehen können, wird yield hier nicht als Anweisung, sondern als Ausdruck verwendet, d. h. es kann in einen Wert weiterentwickelt werden ist der Wert, der vom Aufrufer an die Methode send() übergeben wird. In diesem Beispiel wird der Yield-Ausdruck zuerst durch „Foo“ ersetzt und in Log geschrieben, und dann durch „Bar“ und in Log geschrieben
Das obige Beispiel zeigt yield als Empfänger. Schauen wir uns als Nächstes ein Beispiel an, wie man gleichzeitig empfängt und sendet:<?php function gen() { $ret = (yield 'yield1'); var_dump($ret); $ret = (yield 'yield2'); var_dump($ret); } $gen = gen(); var_dump($gen->current()); // string(6) "yield1" var_dump($gen->send('ret1')); // string(4) "ret1" (the first var_dump in gen) // string(6) "yield2" (the var_dump of the ->send() return value) var_dump($gen->send('ret2')); // string(4) "ret2" (again from within gen) // NULL (the return value of ->send()) ?>Es kann etwas schwierig sein, die genaue Reihenfolge schnell zu verstehen der Ausgabe. Schwierig, aber Sie müssen verstehen, warum sie auf diese Weise ausgegeben wird, damit Sie weiterlesen können. Außerdem möchte ich besonders auf zwei Punkte hinweisen: Der erste Punkt ist der Yield-Ausdruck. Die Klammern auf beiden Seiten der Formel waren vor PHP7 nicht optional, was bedeutet, dass Klammern in PHP5.5 und PHP5.6 erforderlich sind. Zweiter Punkt, Sie haben es vielleicht bemerkt Vor dem Aufruf von current() wird rewind() nicht aufgerufen. Dies liegt daran, dass der Rückspulvorgang beim Generieren des Iterationsobjekts implizit durchgeführt wurde. Empfohlenes Tutorial: „
PHP-Tutorial“
Das obige ist der detaillierte Inhalt vonWas bedeutet PHP-Coroutine?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!