現在 swoole のコルーチンを学習しています。コルーチンの特徴は、同時に実行されるように見えることです。試してみてください。
無料推奨: swoole
この記事の前提は、swoole には次のようなものがあります。 Linux にインストールされています。最新バージョンは 4.5.9 (2020-12-17)
要件を構築し、一度に 5 つのコルーチンを作成します。各コルーチンは 1 ~ 3 秒の間の乱数でスリープし、スリープ時間について出力します。すべてのプログラムが終了するときに、プロセス全体が最大 3 秒かかることを願っています。
1.php
foreach (range(1, 5) as $v) { go(function () { $sleep_time = random_int(1, 3); sleep($sleep_time); echo "睡眠了" . $sleep_time . "秒\n"; });}
php 1.phpを使用して実行するとプログラムは実行できますが、コルーチンという感じではなく同期的に実行されます。実行全体には 3 秒をはるかに超えます。ここには小さなバグがあることが判明しました。プログラム全体に影響を与えることなくこのコルーチン内でスリープできるように、co:sleep を使用する必要があります。
2.php
foreach (range(1, 5) as $v) { go(function () { $sleep_time = random_int(1, 3); co::sleep($sleep_time); echo "睡眠了" . $sleep_time . "秒\n"; });}
結果は次のとおりです:
睡眠了1秒 睡眠了2秒 睡眠了2秒 睡眠了3秒 睡眠了3秒
つまり、スリープ時間が短いコルーチンが最初に終了し、同じ時間スリープしているコルーチンが終了する必要があります。文字も同時に出力します。プログラムの終了時にかかった合計時間は 3 秒であり、同時実行が成功したことを示しています。
5 つのコルーチンが終了したら、hello world が出力されることを願っています。
3.php
foreach (range(1, 5) as $v) { go(function () { $sleep_time = random_int(1, 3); co::sleep($sleep_time); $a = random_int(1, 1000); echo "睡眠了" . $sleep_time . "秒\n"; });}echo "hello world!\n";
結果は別の問題であり、hello world が常に最初に出力されます。
したがって、ここではコルーチン コンテナを使用する必要があります。
4.php
Co\run(function () { foreach (range(1, 5) as $v) { go(function () { $sleep_time = random_int(1, 3); co::sleep($sleep_time); echo "睡眠了" . $sleep_time . "秒\n"; }); }});echo "hello world!\n";
結果は次のとおりです:
睡眠了1秒 睡眠了2秒 睡眠了3秒 睡眠了3秒 睡眠了3秒 hello world!
今回は正しい結果が出力でき、完璧です。
swoole のコルーチンはまだ少し興味深いです ~
以上がswoole コルーチンの予備調査の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。