La coroutine nécessite que la tâche en cours d'exécution rende automatiquement le contrôle au planificateur afin que les autres tâches puissent continuer à s'exécuter. C'est exactement le contraire du multitâche préemptif, où le planificateur peut interrompre de force les tâches en cours, quelle que soit son intention.
Si vous comptez uniquement sur le programme pour transférer automatiquement le contrôle, certains programmes malveillants occuperont facilement tout le temps CPU sans le partager avec d'autres tâches.
La planification de la coroutine est implémentée par la coroutine elle-même, cédant activement le contrôle au planificateur externe
En revenant à l'exemple du générateur implémentant la fonction xrange, l'ensemble du processus d'exécution peut être alterné Utilisez la figure suivante pour le représenter :
Les coroutines peuvent être comprises comme de purs threads en mode utilisateur, qui effectuent des changements de tâches par collaboration plutôt que par préemption. (Apprentissage recommandé : Programmation PHP du débutant à compétent)
Par rapport aux processus ou aux threads, toutes les opérations des coroutines peuvent être effectuées en mode utilisateur au lieu du système d'exploitation Le coût d'achèvement, de création et de commutation avec état du noyau est très faible.
Pour faire simple, coroutine fournit une méthode pour interrompre l'exécution de la tâche en cours, enregistrer les variables locales actuelles et restaurer les variables locales actuelles pour continuer l'exécution la prochaine fois.
La prise en charge de la coroutine est basée sur le générateur, ajoutant la fonction de renvoi des données au générateur (l'appelant envoie des données à la fonction du générateur appelé). Cela amène le générateur à la communication unidirectionnelle entre l'appelant). est transformé en une communication bidirectionnelle entre les deux
Code après utilisation de la coroutine
Première ébauche, exécution du générateur ajustée manuellement
# 本代码手动调整了进程执行代码的顺序,当然本代码实现不用协程也可以,只是利用本流程说明协程作用 # 生成器给了我们函数中断,协程[生成器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
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!