私はRabbitMQからのメッセージを消費する小さなアプリを持っています。while(1)とブロッキングコールの間のパフォーマンス
現在、while(1)ループでは、「デキュー」を呼び出し、永遠にメッセージを待ってからメッセージを処理します。
私はブロッキングコールが「デキュー」といいアイデアを持っていると思っていましたし、即時にDequeueNoWait(すぐに返されるものはありませんでした)とは思えませんでした。もちろん、反復の間はずっと多くなるでしょう。
ありがとう
私はRabbitMQからのメッセージを消費する小さなアプリを持っています。while(1)とブロッキングコールの間のパフォーマンス
現在、while(1)ループでは、「デキュー」を呼び出し、永遠にメッセージを待ってからメッセージを処理します。
私はブロッキングコールが「デキュー」といいアイデアを持っていると思っていましたし、即時にDequeueNoWait(すぐに返されるものはありませんでした)とは思えませんでした。もちろん、反復の間はずっと多くなるでしょう。
ありがとう
これは古典的な問題です。できるだけ多くのことを行うには、ブロックDequeue()
をタイムアウトに使用して、RabbitMQ以外のメッセージを処理できるようにしてください。例えば:ターミナルコマンドでもUNIX/Linux上
にタイムアウトはあなたが期待するものに基づいて設定する必要があります。システム信号によっては、プロセスが水中から飛び出す前に非常に厳密なタイムアウトが与えられます。コンソールアプリケーションの場合、人間のユーザは150msのタイムアウトに気付かず、それでもリアルタイムに近いものに見えます。
ブロックしないでタイムアウトを使用しない場合、CPUは無駄なリソースを消費し、できるだけ早くループスルーするだけで何のメリットもありません。このようなものは、タイミングが非常に重要な場合にのみ推奨されます。しかし、あなたはRabbitMQを使用しません。
EDIT:タイムアウトの詳細
1秒のタイムアウトは、は、メッセージが1秒間に撮像されたことを意味するものではありません。メッセージは到着すると即座に処理されます。タイムアウトとは、OTHERタスクが最大1秒の遅延で実行されることを意味します(平均遅延はタイムアウトの半分で、0.5秒です)。
スピンウェイトは、予想される待機時間が「非常に短い」場合にのみ使用してください。あなたは効果的に何もせずにCPUをビジーに保っています。これを行うことは、別のスレッドへのコンテキスト切り替えを行うよりも安い場合は、良い考えかもしれません。あなたが長い間待っていれば、そうではありません。あなたの事件についてもっと知らなければ、良いアドバイスをするのは難しいです。それらのメソッドの非同期バージョンがありますか? –
残念ながら、非同期はありません。それはとても素敵でした。 – Pintac
@Pintac非同期ラッパーを書くのはとても簡単です。明らかに、I/Oスレッドは犠牲にしなければならない。しかし、これはEDA(イベントドリブンアーキテクチャ、例えばnode.js)では通常の/受け入れ可能で一般的です。したがって、非同期ラッパーのアイデアは、パフォーマンスやリソースの占有面積よりも、プログラミングスタイルと使いやすさに関するものです。 – pid