У меня есть серверное приложение, которое принимает входящие запросы и выполняет их. Если запросов слишком много, они должны быть поставлены в очередь, и если некоторые другие запросы были выполнены, запросы в очереди также должны быть выполнены. Поскольку я хочу передавать запросы с разными приоритетами, я думаю, что использование priority_queue будет лучшим выбором.
например Количество принимаемых запросов (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;
};