着信クエリを受け入れて実行するサーバーアプリケーションがあります。クエリが多すぎる場合はキューに入れ、他のクエリの一部が実行された場合は、キューに入れられたクエリも実行する必要があります。異なる優先度のクエリを渡したいので、priority_queueを使用するのが最善の選択だと思います。
たとえば、受け入れているクエリの量(a)が限界に達し、新しいクエリがキューに保存されます。(a)からのクエリの一部が実行される場合、すべてのクエリの優先度は1(最低)になります。プログラムは、キューから最も優先度の高いクエリを選択して実行します。それでも問題ありません。現在、誰かがキューに追加される優先度5のクエリを送信しています。これは最も優先度の高いクエリであるため、実行中のクエリが制限に達しなくなるとすぐに、アプリケーションはこのクエリを実行します。優先度1の500個のクエリがキューに入れられても、誰かが常に優先度5のクエリを送信しているために実行されないという最悪のケースがあります。したがって、これらの500個のクエリは非常に長い間キューに入れられます。これを防ぐために、優先度の高いクエリよりも優先度の低いすべてのクエリの優先度を上げたいと思います。この例では、優先度が5未満です。したがって、優先度が5のクエリが削除された場合キューのうち、優先度が5未満の他のすべてのクエリは0.2増やす必要があります。このように、優先度の高いクエリが100個ある場合でも、優先度の低いクエリはキューに入れられません。
誰かが優先順位の問題を解決するのを手伝ってくれることを本当に望んでいます:
私のクエリはオブジェクトで構成されているので、次のようなものが機能する可能性があると思いました。
class Query {
public:
Query( std::string p_stQuery ) : stQuery( p_stQuery ) {};
std::string getQuery() const {return stQuery;};
void increasePriority( const float fIncrease ) {fPriority += fIncrease;};
friend bool operator < ( const Query& PriorityFirst, const Query& PriorityNext ) {
if( PriorityFirst.fPriority < PriorityNext.fPriority ) {
if( PriorityFirst.fStartPriority < PriorityNext.fStartPriority ) {
Query qTemp = PriorityFirst;
qTemp.increasePriority( INCREASE_RATE );
}
return true;
} else {
return false;
}
};
private:
static const float INCREASE_RATE = 0.2;
float fPriority; // current priority
float fStartPriority; // initialised priority
std::string stQuery;
};