Maison  >  Article  >  développement back-end  >  Que signifie la coroutine PHP ?

Que signifie la coroutine PHP ?

Guanhui
Guanhuioriginal
2020-06-09 16:21:303178parcourir

Que signifie la coroutine PHP ?

Que signifie la coroutine PHP ?

Les coroutines PHP sont équivalentes aux threads. Les threads signifient que lorsque vous changez de contexte de thread, vous devez d'abord enregistrer le contexte du thread précédent, puis exécuter le thread suivant lorsque les conditions sont remplies, revenir en arrière. au thread précédent et restaurer le contexte, il en va de même pour les coroutines, sauf que les coroutines sont planifiées par l'utilisateur, tandis que les threads sont planifiés par le système.

Utilisation de la coroutine PHP

La prise en charge de la coroutine est basée sur le générateur itératif, ajoutant la fonction de renvoi de données au générateur (l'appelant envoie des données à la fonction du générateur appelé ). Cela transforme la communication unidirectionnelle du générateur vers l'appelant en une communication bidirectionnelle entre les deux

La fonction de transmission des données se fait via la méthode send() de l'itérateur. La coroutine logger() est un exemple du fonctionnement de cette communication :

<?php
function logger($fileName) {
    $fileHandle = fopen($fileName, &#39;a&#39;);
    while (true) {
        fwrite($fileHandle, yield . "\n");
    }
}
$logger = logger(__DIR__ . &#39;/log&#39;);
$logger->send(&#39;Foo&#39;);
$logger->send(&#39;Bar&#39;)
?>

Comme vous pouvez le voir, ici le rendement n'est pas utilisé comme une instruction, mais comme une expression, c'est-à-dire qu'il peut être transformé en une valeur. est la valeur transmise par l'appelant à la méthode send(). Dans cet exemple, l'expression de rendement sera d'abord remplacée par "Foo" puis écrite dans Log par "Bar".

L'exemple ci-dessus démontre le rendement. en tant que destinataire. Ensuite, regardons un exemple de la façon de recevoir et d'envoyer en même temps :

<?php
function gen() {
    $ret = (yield &#39;yield1&#39;);
    var_dump($ret);
    $ret = (yield &#39;yield2&#39;);
    var_dump($ret);
}
$gen = gen();
var_dump($gen->current());    // string(6) "yield1"
var_dump($gen->send(&#39;ret1&#39;)); // string(4) "ret1"   (the first var_dump in gen)
                              // string(6) "yield2" (the var_dump of the ->send() return value)
var_dump($gen->send(&#39;ret2&#39;)); // string(4) "ret2"   (again from within gen)
                              // NULL               (the return value of ->send())
?>

Il peut être un peu difficile de comprendre rapidement l'ordre précis de la sortie. Difficile, mais vous. Il faut comprendre pourquoi il est sorti de cette manière pour que vous puissiez continuer à lire

De plus, il y a deux points que je tiens à souligner en particulier :

Le premier point est l'expression de rendement. Les crochets de part et d'autre de la formule n'étaient pas facultatifs avant PHP7, ce qui signifie que les parenthèses sont obligatoires en PHP5.5 et PHP5.6

Deuxième point, vous l'avez peut-être remarqué avant d'appeler current() rewind(). n'est pas appelé. C'est parce que l'opération de rembobinage a été implicitement effectuée lors de la génération de l'objet d'itération

Tutoriel recommandé : "Tutoriel PHP"

.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn