ホームページ >バックエンド開発 >PHPの問題 >PHPコルーチンとはどういう意味ですか?

PHPコルーチンとはどういう意味ですか?

Guanhui
Guanhuiオリジナル
2020-06-09 16:21:303221ブラウズ

PHPコルーチンとはどういう意味ですか?

#PHP コルーチンとはどういう意味ですか?

PHP コルーチンはスレッドと同等です。スレッドとは、スレッド コンテキストを切り替えるときに、まず前のスレッドのコンテキストを保存してから、次のスレッドを実行する必要があることを意味します。条件が満たされたら、元に切り替えます。スレッドとコンテキストの復元は、コルーチンがユーザーによってスケジュールされるのに対し、スレッドはシステムによってスケジュールされることを除いて、コルーチンにも同じことが当てはまります。

PHP コルーチンの使用法

コルーチンのサポートは反復ジェネレーターに基づいており、ジェネレーターにデータを送り返す機能が追加されています (呼び出し元は、呼び出されたジェネレーター関数にデータを送信します)。 ). これにより、ジェネレータから呼び出し元への一方向通信が、両者の間の双方向通信に変更されます。

データを渡す機能は、実装されたイテレータの send() メソッドを通じて行われます。 logger() コルーチンは、この通信がどのように機能するかを示す例です:

<?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;)
?>

ご覧のとおり、ここでは yield がステートメントとしてではなく式として使用されており、値に展開できます。呼び出し元によって send() メソッドに渡される値です。この例では、yield 式は最初に「Foo」に置き換えられて Log に書き込まれ、次に「Bar」に置き換えられて Log に書き込まれます。

上記の例は、受信者としての yield を示しています。次に、受信と送信を同時に行う方法の例を見てみましょう:

<?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())
?>

正確な順序をすぐに理解するのは少し難しいかもしれません。難しいですが、読み続けるためには、なぜこのように出力されるのかを理解する必要があります。

さらに、特に指摘したい点が 2 つあります:

最初のポイント、yield 式 PHP7 より前では、式の両側の括弧はオプションではありませんでした。つまり、PHP5.5 と PHP5.6 では括弧が必要になります。 current() の呼び出し rewind() は呼び出されません。これは、反復オブジェクトの生成時に巻き戻し操作が暗黙的に実行されているためです。

推奨チュートリアル: "

PHP チュートリアル

"

以上がPHPコルーチンとはどういう意味ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。