swooleコルーチンと非同期の違い

(*-*)浩
リリース: 2019-12-16 11:05:42
オリジナル
8162 人が閲覧しました

swooleコルーチンと非同期の違い

バージョン 4.0 以降、Swoole は完全なコルーチン (Coroutine) チャネル (Channel) 機能を提供し、新しい CSP プログラミング モデルをもたらします。

アプリケーション層は完全同期プログラミングを使用でき、最下位層は非同期 IO を自動的に実装します。 (推奨される学習: swoole ビデオ チュートリアル )

go(function () {
    $redis = new Swoole\Coroutine\Redis();
    $redis->connect('127.0.0.1', 6379);
    $val = $redis->get('key');
});
ログイン後にコピー

4.0.0 以降のバージョンでは PHP7 のみがサポートされます

バージョン 4.0 以降は削除されました。 1 --enable-coroutine コンパイル オプション、動的構成に変更されました。

Coroutine は、プリエンプションではなく協調を通じて切り替える純粋なユーザー モード スレッドとして理解できます。プロセスやスレッドと比較して、コルーチンのすべての操作はユーザー モードで完了でき、作成コストや切り替えコストが低くなります。

Swoole はリクエストごとに対応するコルーチンを作成し、IO ステータスに応じてコルーチンを合理的にスケジュールできるため、次の利点が得られます:

開発ユーザーは同期を使用できます。意識せずに非同期 IO の効果とパフォーマンスを達成するためのコード記述。従来の非同期コールバックによって引き起こされる個別のコード ロジックを回避し、マルチレイヤー コールバックに閉じ込められて、コードが保守不能になることを回避します。最下位層はコルーチンをカプセル化するため、従来の PHP 層コルーチン フレームワークと比較して、開発者はコルーチン IO 操作を識別するために yield キーワードを使用する必要がないため、コルーチン IO 操作を深く理解する必要はありません。 yield のセマンティクスと各レベルの呼び出し。すべてが yield に変更されるため、開発効率が大幅に向上し、ほとんどの開発者のニーズを満たすことができます。プライベート プロトコルの場合、開発者はコルーチンの TCP または UDP インターフェイスを使用してカプセル化を簡単に行うことができます。

チャット サーバーからブロードキャストを送信したり、Web サーバーから電子メールを送信したりするなど、サーバー プログラムで時間のかかる操作を実行する必要がある場合。これらの関数を直接実行すると、現在のプロセスがブロックされ、サーバーの応答が遅くなります。

Swoole は、現在のリクエストの処理速度に影響を与えることなく、非同期タスクを TaskWorker プロセス プールに配信して実行できる非同期タスク処理の機能を提供します。

プログラム コード

最初の TCP サーバーに基づいて、追加する必要があるのは 2 つのイベント コールバック関数 (onTask と onFinish) だけです。また、タスクの処理数を設定する必要がありますが、タスクの消費時間やタスク量に応じて、適切なタスクの処理数を設定できます。

$serv = new swoole_server("127.0.0.1", 9501);

//设置异步任务的工作进程数量
$serv->set(array('task_worker_num' => 4));

$serv->on('receive', function($serv, $fd, $from_id, $data) {
    //投递异步任务
    $task_id = $serv->task($data);
    echo "Dispath AsyncTask: id=$task_id\n";
});

//处理异步任务
$serv->on('task', function ($serv, $task_id, $from_id, $data) {
    echo "New AsyncTask[id=$task_id]".PHP_EOL;
    //返回任务执行的结果
    $serv->finish("$data -> OK");
});

//处理异步任务的结果
$serv->on('finish', function ($serv, $task_id, $data) {
    echo "AsyncTask[$task_id] Finish: $data".PHP_EOL;
});

$serv->start();
ログイン後にコピー
$serv->task() を呼び出した後、プログラムはすぐに戻り、コードの実行を続けます。 onTask コールバック関数は、Task プロセス プールで非同期に実行されます。実行が完了したら、$serv->finish() を呼び出して結果を返します。

以上がswooleコルーチンと非同期の違いの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート