我正在围绕任务队列构建一个应用程序:它为多个异步连接的客户端提供一系列任务。问题是任务必须按随机顺序提供。
我的问题是,我现在使用的算法计算成本很高,因为它依赖于许多来自数据库的大型查询和传输。我有一种强烈的预感,有一种更便宜的方法可以达到同样的结果,但我看不出解决方案。你能想出一个聪明的办法来解决这个问题吗?
以下是我现在使用的(计算成本高昂)算法:
当客户端查询新任务时。。。
- 查询数据库中的"未完成"任务
- 将所有任务放在列表中
- 无序播放列表(使用random.Shuffle)
- 将第一个任务标记为"正在进行"
- 将任务参数发送给客户端以完成
当客户端完成任务时。。。
6a。记录结果并将任务标记为"已完成"
如果客户未能在截止日期前完成任务。。。
6b。将任务重新标记为"未完成"。
似乎我们可以通过用伪随机序列或散列函数替换步骤1、2和3来做得更好。但我不太清楚整个解决方案。想法?
其他注意事项:
- 如果这很重要,我将使用python和mongodb来完成所有这些。(Mongodb没有一些聪明的"使用find_one有效地返回随机匹配条目"的用法,是吗?)
- "队列"这个词有点误导人。所有任务都存储在mongodb中单个集合的子字段中。集合中的长度(任务总数)是已知的,并且在开始时是固定的
- 如果有必要,可以多次分配同一任务,只要这种情况很少发生。但这种情况需要非常罕见,因为完成每项任务都很昂贵
- 我有每个客户的身份信息,所以我们确切地知道每个任务请求的发起人
有一种简单的方法可以从MongoDB中获得随机文档!
查看MongoDB 的随机记录
如果您不希望一个任务被选中两次,您可以将该任务标记为活动任务,而不选择它。
啊,根据我错过的评论,你可以沿着以下几行做一些事情:
import random
available = range(lengthofdatabase)
inprogress = []
while len(available) > 0:
taskindex = available.pop(random.randrange(0, len(available)))
# I'm not sure of your implementation, but you said something
# along these lines was possible
task = GetTask(taskindex)
inprogress.append(taskindex)
我不确定你正在使用的任何函数——这只是一个算法。
快乐编码!