Dieser Artikel bietet Ihnen eine detaillierte Erklärung der PHP-Coroutinen (mit Beispielen). Freunde in Not können darauf verweisen.
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 调度器抢占式
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 Kontrolle an den äußeren Scheduler abgeben 主动
verstanden werden, und der Aufgabenwechsel wird durch 纯用户态的线程
anstelle von Preemption durchgeführt. 协作
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. 协程
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
Mehrere Vorgänge können innerhalb überlappender Zeiträume ausgeführt werden.
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并行
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
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
# 本代码手动调整了进程执行代码的顺序,当然本代码实现不用协程也可以,只是利用本流程说明协程作用 # 生成器给了我们函数中断,协程[生成器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 vonDetaillierte Erklärung der PHP-Coroutine (mit Beispielen). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!