我有一个接受传入查询并执行它们的服务器应用程序。如果查询太多,则应将它们排队,并且如果执行了其他一些查询,则也应执行排队的查询。由于我想传递具有不同优先级的查询,我认为使用 priority_queue 将是最佳选择。
例如,接受查询的数量(a)达到限制,新查询将存储在队列中。如果来自 (a) 的一些查询被执行,则所有查询的优先级为 1(最低),程序将从队列中选择具有最高优先级的查询并执行它。仍然没有问题。现在有人正在发送一个优先级为 5 的查询,该查询被添加到队列中。由于这是具有最高优先级的查询,一旦运行的查询不再达到限制,应用程序就会执行此查询。最坏的情况可能是 500 个优先级为 1 的查询排队但不会执行,因为有人总是发送优先级为 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;
};