swoole タスクのドキュメントを注意深く読んでいる場合は、次の文に気づいたはずです。
タスク操作の数は、onTask の処理速度よりも小さくなければなりません。 . If 配信能力が処理能力を超えると、タスクがキャッシュ領域を埋め尽くし、ワーカープロセスがブロックされてしまいます。
## ワーカー プロセスは新しいリクエストを受信できなくなります (推奨学習: SWOOLE ビデオ チュートリアル )
タスクがブロックされている場合、ワーカー プロセスがブロックされ、サービスが機能しなくなり、問題が発生します。
サービスのリンクログを送信するタスクを使用したことがありますが、ログを受信するサービスにバグが発生し、ログを送信するタスクがブロックされ、gg が提供されてしまいました。その後、タスクに一連の最適化を加えました。
アイデアは、swoole チャネルと swoole ユーザー プロセスを使用して一連のタスクを実装することです。
チャネルを使用してデータを受信し、ユーザー プロセスでデータを消費します。チャネルがいっぱいの場合、データのプッシュが失敗するだけであり、ブロックは発生しません。これはリンクであるためです。ログの損失は許容されるため、この解決策はまったく問題ありません。
スウール ユーザー プロセスのチャネル消費戦略の擬似コードは次のとおりです。
$sleepTime = 5; $maxSleepTime = 100; while (true) { $task = $chan->pop(); if ($task === false) { $sleepTime = $sleepTime + 5; if ($sleepTime > $maxSleepTime) { $sleepTime = $maxSleepTime; } usleep($sleepTime * 1000); continue; } $sleepTime = 0; // 处理数据 }
チャネル データが消費されると、データの処理に無限ループが使用されます。 , なぜなら、データ処理プロセス中には他の操作があるため、CPUをあまり消費しません。
データを消費できない場合は、5ms スリープし、最大値の 100ms に達するまでスリープ時間を順次累積して、CPU 使用率とデータのリアルタイム処理のバランスが取れます。ポイントは自社の業務に合わせて決めることができるので調整が必要です。
以上がswooleタスクはブロックしますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。