swoole でタスクプロセスを使用して時間のかかるタスクを処理するにはどうすればよいですか?
この記事では、swooleのタスクプロセスを利用して時間のかかるタスクを処理する方法を紹介しますが、一定の参考になるので、これからswooleのフレームワークを学習する学生の参考になれば幸いです。
#swoole でタスクプロセスを使用して時間のかかるタスクを処理するにはどうすればよいですか?
swoole には 2 つの主要なプロセス、つまり master main プロセスと manager management プロセスがあることがわかっています。
マスター メイン プロセスにはメイン リアクター スレッドと複数のリアクター スレッドがあり、主な機能は TCP 接続の維持、ネットワーク IO の処理、データの送受信です。
マネージャーはプロセスを管理し、その役割はワーカーとタスクのプロセスをフォークして管理することです。
ワーカープロセスの機能は、リアクタースレッドから渡されたデータを受け取り、データを処理し、処理結果をリアクタースレッドに返すことです。
タスク プロセスの役割は、比較的時間のかかるタスクを処理することです。タスク プロセスはワーカー プロセスから独立しており、クライアント リクエストのワーカー プロセスの処理には影響しません。
1. タスク プロセスの適用シナリオ:
1. 100 万人のユーザーにイベント メールを送信する必要がある特定のイベントなど、比較的時間のかかる大量メール送信。
2. 特定の大きな V の更新をプッシュします。たとえば、大きな V が新しいメッセージを投稿した場合、ファンは時間内に更新を取得する必要があります。
推奨学習: swoole チュートリアル
2. ワーカーとタスクの関係:
1. できることワーカー プロセス内 タスクは task() を呼び出すことによって配信され、タスク プロセスは onTask イベントを通じて配信されたタスクに応答します。
2. タスク プロセスでは、直接返すか、finish() を呼び出すことで、タスクが完了したことをワーカー プロセスに伝えることができます。ワーカー プロセスでは、onFinish イベントを通じてタスクの完了に応答できます。
3. タスクを使用するための前提条件:
1. Server で task_worker_num の数を設定します。
2. サーバーの onTask および onFinish イベント コールバック関数を設定します。
4. task を使用して累積合計を計算する簡単な例
<?php $server = new swoole_server('0.0.0.0', 6666); $server->set([ 'worker_num' => 2, 'task_worker_num' => 16, ]); $server->on('WorkerStart', function ($server, $worker_id) { //注意这里,我们通过taskworker来判断是task进程还是worker进程 //需要在worker进程中调用task(),不然会报出警告 //这里会执行两遍,因为我们设置了worker_num数为2 if (!$server->taskworker) { echo '投递任务开始...', PHP_EOL; //投递32个累加计算任务给16个task进程 for ($ix = 0; $ix < 32; $ix++) { //注意这里的投递是异步的 $server->task([mt_rand(1, 100), mt_rand(1000, 9999)]); } echo '投递任务结束...', PHP_EOL; } }); //server服务必须要有onReceive回调 $server->on('Receive', function ($server, $fd, $reactor_id, $data) { }); //注意,task进程完全是同步阻塞模式的 $server->on('Task', function ($server, $task_id, $src_worker_id, $data) { echo "task {$task_id} 进程正在工作...", PHP_EOL; $start = $data[0]; $end = $data[1]; $total = 0; for (; $start <= $end; $start++) { $total += $start; } echo "task {$task_id} 进程完成工作...", PHP_EOL; return $total; }); $server->on('Finish', function ($server, $task_id, $data) { echo "task {$task_id} 进程处理完成, 结果为 {$data}", PHP_EOL; }); $server->start();
task() を呼び出してタスクをタスク プールに配信することに注意してください。最下層は順番に各タスクプロセスに配信タスクをクエリします。
配信するタスクの数が onTask の処理速度を超えると、タスク プールがいっぱいになり、ワーカー プロセスがブロックされてしまうため、task_worker_num の数と処理速度を適切に設定する必要があります。
もちろん、指定されたタスク プロセスにタスクを手動で配信することもできます。 task() 関数の第 2 引数には、配信するタスクのプロセス ID を指定できます。ID の範囲は 0 ~ (task_worker_num - 1) です。
5. タスクをセグメント化し、タスク プロセスへの配信を手動で制御します
<?php $server = new swoole_server('0.0.0.0', 6666); $server->set([ 'worker_num' => 1, 'task_worker_num' => 10, ]); $server->on('WorkerStart', function ($server, $worker_id) { //为了方便演示,把worker_num设置为1,这里只会执行一次 if (!$server->taskworker) { //通过swoole_table共享内存,在不同进程中共享数据 $server->result = new swoole_table(10240); //用于保存task进程完成数量 $server->result->column('finish_nums', swoole_table::TYPE_INT); //用于保存最终计算结果 $server->result->column('result', swoole_table::TYPE_INT); $server->result->create(); //计算1000的累加和,并把计算任务分配到10个task进程上 $num = 1000; $step = $num / $server->setting['task_worker_num']; for ($ix = 0; $ix < $server->setting['task_worker_num']; $ix++) { $start = $ix * $step; $server->task([$start, $start + $step], $ix); } } }); $server->on('Receive', function ($server, $fd, $reactor_id, $data) { }); //注意,task进程完全是同步阻塞模式的 $server->on('Task', function ($server, $task_id, $src_worker_id, $data) { echo "task {$task_id} 进程正在工作... 计算 {$data[0]} - {$data[1]} ", PHP_EOL; $start = ++$data[0]; $end = $data[1]; $total = 0; for (; $start <= $end; $start++) { $total += $start; } echo "task {$task_id} 进程完成工作...", PHP_EOL; return $total; }); $server->on('Finish', function ($server, $task_id, $data) { echo "task {$task_id} 进程处理完成, 结果为 {$data}", PHP_EOL; $server->result->incr('finish_nums', 'finish_nums'); $server->result->set('result', ['result' => $data + $server->result->get('result', 'result')]); if ($server->result->get('finish_nums', 'finish_nums') == $server->setting['task_worker_num']) { echo "最终计算结果:{$server->result->get('result', 'result')}", PHP_EOL; } }); $server->s tart();
以上がswoole でタスクプロセスを使用して時間のかかるタスクを処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











最近、多くの Win11 ユーザーが、シャットダウン時に、taskhostwindow タスク ホストがシャットダウン タスクを実行しているというメッセージが表示されると報告しています。ユーザーは、ローカル レジストリ エディターの下のデスクトップ フォルダーに入り、右側のウィンドウで AutoEndTasks を選択して設定できます。このサイトは、シャットダウン時にこの問題の解決策をユーザーに丁寧に紹介します。 Windows 11 のシャットダウンでは、taskhostwindow タスク ホストがシャットダウン タスクを実行していることを示すメッセージが表示されます。 解決策 1. 次の図に示すように、win キー + r キーの組み合わせを使用し、「regedit」と入力して Enter キーを押します。 2. [HKEY]を検索します

Laravel で Swoole コルーチンを使用すると、大量のリクエストを同時に処理でき、次のような利点があります: 同時処理: 複数のリクエストを同時に処理できます。高いパフォーマンス: Linux の epoll イベント メカニズムに基づいて、リクエストを効率的に処理します。低リソース消費: 必要なサーバー リソースが少なくなります。統合が簡単: Laravel フレームワークとのシームレスな統合が可能で、使いやすいです。

Swoole と Workerman はどちらも高性能の PHP サーバー フレームワークです。 Swoole は、非同期処理、優れたパフォーマンス、スケーラビリティで知られており、多数の同時リクエストと高スループットを処理する必要があるプロジェクトに適しています。 Workerman は、使いやすさや同時実行量が少ないプロジェクトに適した直感的な API を備え、非同期モードと同期モードの両方の柔軟性を提供します。

Swoole プロセスではユーザーを切り替えることができます。具体的な手順は、プロセスの作成、プロセス ユーザーの設定、プロセスの開始です。

Swoole サービスを再起動するには、次の手順に従います。 サービスのステータスを確認し、PID を取得します。サービスを停止するには、「kill -15 PID」を使用します。サービスの開始に使用したのと同じコマンドを使用してサービスを再起動します。

パフォーマンスの比較: スループット: Swoole は、コルーチン メカニズムのおかげでスループットが高くなります。レイテンシー: Swoole のコルーチン コンテキスト スイッチングは、オーバーヘッドが低く、レイテンシーが小さくなります。メモリ消費量: Swoole のコルーチンが占有するメモリは少なくなります。使いやすさ: Swoole は、より使いやすい同時プログラミング API を提供します。

Swoole の動作: 同時タスク処理にコルーチンを使用する方法 はじめに 日常の開発では、複数のタスクを同時に処理する必要がある状況によく遭遇します。従来の処理方法は、マルチスレッドまたはマルチプロセスを使用して同時処理を実現することでしたが、この方法にはパフォーマンスとリソース消費の点で特定の問題がありました。スクリプト言語である PHP は通常、タスクを処理するためにマルチスレッドまたはマルチプロセス メソッドを直接使用できません。ただし、Swoole コルーチン ライブラリの助けを借りて、コルーチンを使用して高パフォーマンスの同時タスク処理を実現できます。この記事で紹介するのは

Swoole コルーチンは、開発者が並行プログラムを作成できるようにする軽量の並行性ライブラリです。 Swoole コルーチンのスケジューリング メカニズムは、コルーチン モードとイベント ループに基づいており、コルーチン スタックを使用してコルーチンの実行を管理し、コルーチンが制御を放棄した後にコルーチンを一時停止します。イベント ループは IO およびタイマー イベントを処理します。コルーチンが制御を放棄すると、中断されてイベント ループに戻ります。イベントが発生すると、Swoole はイベント ループから保留中のコルーチンに切り替え、コルーチンの状態を保存してロードすることで切り替えを完了します。コルーチンのスケジューリングは優先メカニズムを使用し、コルーチンの実行を柔軟に制御するためにサスペンド、スリープ、再開の操作をサポートします。
