首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何排序繁忙的队列,以便低优先级的项目也得到处理?

如何排序繁忙的队列,以便低优先级的项目也得到处理?
EN

Stack Overflow用户
提问于 2013-08-15 11:27:10
回答 4查看 609关注 0票数 1

我们使用mysql表实现了一个基本的作业队列,其中一些项的优先级低于其他项。由于队列中不断填充高优先级项,所以低优先级项有时不会被处理。

在我们的实现中,我们将项目及其优先级插入到表中,为了从队列中获取下一项,我们按如下方式查询表:

代码语言:javascript
复制
SELECT * FROM `queue` ORDER BY `priority` DESC, `created_at` ASC

我们应该如何建模队列,以使低优先级的项目仍然得到及时处理?

编辑

队列中通常包含超过25,000件物品。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-08-15 11:34:21

也许您可以根据队列中的时间来权衡优先级。这样,优先级就会增加任务未完成的时间,最终这些任务应该会移到列表的首位。

看起来您已经掌握了有关任务何时被记录的数据("created_at"),所以我认为您已经具备了所需的一切:

代码语言:javascript
复制
SELECT * FROM queue ORDER BY priority*( now() - created_at ) DESC
票数 5
EN

Stack Overflow用户

发布于 2013-08-15 11:36:48

这样做的经典方法是在选择一个项目后立即增加队列中每个项目的优先级。这样,旧的、低优先级的项目就会积累足够的优先级,超过任何新的高优先级项目。

就像一个循环

代码语言:javascript
复制
SELECT * FROM `queue` ORDER BY `priority` DESC, `created_at` ASC LIMIT 1;
-- read selected queue item
DELETE FROM `queue`WHERE <primary key>=<primary key of selected element>;
UPDATE `queue` SET `priority`=`priority`+1;

应该够好的

票数 1
EN

Stack Overflow用户

发布于 2013-08-15 13:50:13

已经张贴了两个答案,一个使用动态计算的时间差,另一个涉及整个数据库的更新。第三种方案不需要这两种方法之一,即在插入新项时调整优先级值。例如,当插入具有优先级的项时,将“优先级”列设置为P,并将另一列“priority_adjusted”设置为P,其中X是一个整数,每秒钟或每分钟增加一次。然后查询

代码语言:javascript
复制
SELECT * FROM `queue` ORDER BY `priority_adjusted` DESC;

按处理顺序返回项,列“优先级”包含原始优先级。这应该是快速的,因为它不需要动态计算任何东西,也不需要数据库更新。

处理数据库的系统必须只执行以下操作:

代码语言:javascript
复制
every <time interval>:
   X = X + 1

当将set priority_adjusted插入到priority减去X。

如果您的优先级值介于1..100之间,那么在100间隔(X增加100倍)之后,从时间0开始的所有最低优先级项都将在插入时间100的任何项之前被处理。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18251744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档