Heim  >  Artikel  >  Backend-Entwicklung  >  Was ist PHP-Coroutine?

Was ist PHP-Coroutine?

(*-*)浩
(*-*)浩Original
2019-09-16 13:32:552773Durchsuche

Die Coroutine erfordert, dass die aktuell laufende Aufgabe automatisch die Kontrolle an den Scheduler zurückgibt, damit andere Aufgaben weiterhin ausgeführt werden können. Dies ist genau das Gegenteil von präemptivem Multitasking, bei dem der Planer laufende Aufgaben ungeachtet ihrer Absicht zwangsweise unterbrechen kann.

Was ist PHP-Coroutine?

Wenn Sie sich nur darauf verlassen, dass das Programm automatisch die Kontrolle übergibt, beanspruchen einige Schadprogramme leicht die gesamte CPU-Zeit, ohne sie mit anderen Aufgaben zu teilen.

Die Planung der Coroutine wird dadurch implementiert, dass die Coroutine selbst aktiv die Kontrolle an den äußeren Scheduler abgibt.

Um auf das Beispiel des Generators zurückzukommen, der die xrange-Funktion implementiert, kann der gesamte Ausführungsprozess erfolgen alternierend Verwenden Sie zur Darstellung die folgende Abbildung:

Coroutinen können als reine Benutzermodus-Threads verstanden werden, die den Aufgabenwechsel durch Zusammenarbeit und nicht durch Vorkaufsrecht durchführen. (Empfohlenes Lernen: PHP-Programmierung vom Anfänger bis zum Experten)

Im Vergleich zu Prozessen oder Threads können alle Vorgänge von Coroutinen im Benutzermodus statt im Betriebssystem ausgeführt werden Die Kosten für die zustandsbehaftete Vervollständigung, Erstellung und Umstellung des Kernels sind sehr gering.

Einfach ausgedrückt bietet Coroutine eine Methode, um die Ausführung der aktuellen Aufgabe zu unterbrechen, die aktuellen lokalen Variablen zu speichern und die aktuellen lokalen Variablen wiederherzustellen, um die Ausführung beim nächsten Mal fortzusetzen.

Coroutine-Coroutine-Unterstützung basiert auf dem Generator und fügt die Funktion zum Zurücksenden von Daten an den Generator hinzu (der Anrufer sendet Daten an die aufgerufene Generatorfunktion. Dadurch wird der Generator zur einseitigen Kommunikation zwischen dem Anrufer). wird in eine bidirektionale Kommunikation zwischen den beiden umgewandelt

Code nach Verwendung von Coroutine

Erster Entwurf, manuell angepasster Generator wird ausgeführt

# 本代码手动调整了进程执行代码的顺序,当然本代码实现不用协程也可以,只是利用本流程说明协程作用
# 生成器给了我们函数中断,协程[生成器send]给了我们重新唤起生成器函数的能力
function printNumWithGen($max)
{
    for ($i=0; $i<$max; $i++ ) {
        $res = yield $i;
        echo $res;
    }
}
$gen1 = printNumWithGen(3);
$gen2 = printNumWithGen(3);

// 手动执行caller1 再 caller2
$gen1->send("调度者: caller1 打印:" . $gen1->current() . PHP_EOL);
$gen2->send("调度者: caller2 打印:" . $gen2->current() . PHP_EOL);

// 手动执行caller1 再 caller2
$gen1->send("调度者: caller1 打印:" . $gen1->current() . PHP_EOL);
$gen2->send("调度者: caller2 打印:" . $gen2->current() . PHP_EOL);

// 手动执行caller2 再 caller1
$gen2->send("调度者: caller2 打印:" . $gen2->current() . PHP_EOL);
$gen1->send("调度者: caller1 打印:" . $gen1->current() . PHP_EOL);

# output
调度者: caller1 打印:0
调度者: caller2 打印:0
调度者: caller1 打印:1
调度者: caller2 打印:1
调度者: caller2 打印:2
调度者: caller1 打印:2

Das obige ist der detaillierte Inhalt vonWas ist PHP-Coroutine?. 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