Heim >Backend-Entwicklung >PHP-Tutorial >Detaillierte Erklärung der PHP-Coroutine (mit Beispielen)

Detaillierte Erklärung der PHP-Coroutine (mit Beispielen)

不言
不言Original
2018-09-20 17:41:325136Durchsuche

Dieser Artikel bietet Ihnen eine detaillierte Erklärung der PHP-Coroutinen (mit Beispielen). Freunde in Not können darauf verweisen.

Multitasking (Parallelität und Parallelität)

Bevor wir über Coroutinen sprechen, sprechen wir über Multiprozesse, Multithreads, Parallelität und Parallelität.

Bei Single-Core-Prozessoren besteht das Prinzip des Multiprozess-Multitasking darin, das Betriebssystem jedes Mal einer Aufgabe eine bestimmte CPU-Zeitscheibe zuweisen zu lassen, dann zu unterbrechen und die nächste Aufgabe eine bestimmte Zeitscheibe ausführen zu lassen. und dann erneut unterbrechen und mit dem nächsten fortfahren, und so weiter.

Da der Wechsel der Ausführungsaufgaben sehr schnell erfolgt, hat der externe Benutzer das Gefühl, dass mehrere Aufgaben gleichzeitig ausgeführt werden.

Die Planung mehrerer Prozesse wird vom Betriebssystem implementiert. Der Prozess selbst kann nicht steuern, wann er geplant wird. Mit anderen Worten: 进程的调度 wird von der äußeren Schicht implementiert 调度器抢占式

Die Coroutine erfordert, dass die aktuell laufende Aufgabe die Kontrolle automatisch an den Scheduler zurückgibt, damit andere Aufgaben weiterhin ausgeführt werden können. Dies ist genau das Gegenteil von

s Multitasking. Ein Planer, der Multitasking verhindert, kann laufende Aufgaben ungeachtet seiner eigenen Absichten zwangsweise unterbrechen. Wenn das Programm nur automatisch die Kontrolle abgeben würde, wäre es für ein Schadprogramm leicht, die gesamte CPU-Zeit zu beanspruchen, ohne sie mit anderen Aufgaben zu teilen. 抢占式

Die Planung der Coroutine wird von der Coroutine selbst implementiert

die Kontrolle an den äußeren Scheduler abgeben 主动

Um auf das Beispiel des Generators zurückzukommen, der die xrange-Funktion implementiert, den gesamten Ausführungsprozess Der Wechsel kann durch die folgende Abbildung dargestellt werden:

Coroutine kann als

verstanden werden, und der Aufgabenwechsel wird durch 纯用户态的线程 anstelle von Preemption durchgeführt. 协作

Im Vergleich zu Prozessen oder Threads können alle Vorgänge von Coroutinen im Benutzermodus statt im Kernelmodus des Betriebssystems ausgeführt werden, und die Kosten für die Erstellung und den Wechsel sind sehr gering.

Einfach ausgedrückt

besteht darin, eine Methode bereitzustellen, 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. 协程

Wir können die große Aufgabe in mehrere kleine Aufgaben aufteilen und diese nacheinander ausführen. Wenn eine kleine Aufgabe auf System-E/A wartet, können wir sie überspringen und die nächste kleine Aufgabe ausführen und weiter, um IO zu erreichen. Die parallele Ausführung von Operationen und CPU-Berechnungen verbessert im Allgemeinen die Ausführungseffizienz von Aufgaben, was die Bedeutung von Coroutinen ist

Multi-Threads

Unter einem einzelnen Kern müssen Multi-Threads vorhanden sein gleichzeitig;
Das aktuelle Multithreading einheitlicher Prozesse kann jedoch auf Multi-Core-CPUs ausgeführt werden, sodass es parallelisiert werden kann

Parallelität

bezieht sich auf die Fähigkeit, mehrere gleichzeitige Aktivitäten abzuwickeln Gleichzeitige Ereignisse müssen nicht unbedingt gleichzeitig auftreten.

Parallesim

bezieht sich auf zwei gleichzeitig auftretende Ereignisse, was Parallelität bedeutet, aber Parallelität ist nicht unbedingt parallel.

Mehrere Vorgänge können innerhalb überlappender Zeiträume ausgeführt werden.

Der Unterschied zwischen Parallelität und Parallelität

bezieht sich auf die Struktur des Programms, 并发 bezieht sich auf den Zustand des Programms, wenn es ausgeführt wird 并行
muss gleichzeitig sein, 并行Es ist eine Art 并行 Design并发Ein einzelner Thread kann niemals den
-Zustand erreichen并行

Coroutine

Coroutine-Unterstützung wird basierend auf Eine Funktion, die Daten an den Generator zurücksenden kann (der Aufrufer sendet Daten an die aufgerufene Generatorfunktion

Dies wandelt die einseitige Kommunikation vom Generator zum Aufrufer in eine bidirektionale Kommunikation zwischen beiden um). 🎜> Wir haben bereits im letzten Artikel über die Sendemethode gesprochen生成器
synchroner Code

Bevor der asynchrone Ausführungscode nicht beteiligt ist, sieht unser Code so aus

function printNum($max, $caller)
{
    for ($i=0; $i<$max; $i++ ) {
        echo "调度者:" . $caller . "  打印:" . $i . PHP_EOL;
    }
}

printNum(3, "caller1");
printNum(3, "caller2");

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

Verbesserter Code nach der Verwendung von Coroutinen

Erster Entwurf, manuelle Anpassung der Generatorausführung

# 本代码手动调整了进程执行代码的顺序,当然本代码实现不用协程也可以,只是利用本流程说明协程作用
# 生成器给了我们函数中断,协程[生成器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

Zusammenfassung

Der obige Fall sollte jedem helfen, das Coroutine-Design zu verstehen. Die Bedeutung von und So verwenden Sie Coroutinen

Anschließend erstellen wir automatisch einen automatischen Scheduler (Co Automatic Executor) für unsere Coroutinen, sodass keine manuelle Unterbrechung und Fortsetzung erforderlich ist


Das obige ist der detaillierte Inhalt vonDetaillierte Erklärung der PHP-Coroutine (mit Beispielen). 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

In Verbindung stehende Artikel

Mehr sehen