有没有一种方法可以使用伪随机序列或哈希函数来模拟队列的python随机性



我正在围绕任务队列构建一个应用程序:它为多个异步连接的客户端提供一系列任务。问题是任务必须按随机顺序提供

我的问题是,我现在使用的算法计算成本很高,因为它依赖于许多来自数据库的大型查询和传输。我有一种强烈的预感,有一种更便宜的方法可以达到同样的结果,但我看不出解决方案。你能想出一个聪明的办法来解决这个问题吗?

以下是我现在使用的(计算成本高昂)算法:

当客户端查询新任务时。。。

  1. 查询数据库中的"未完成"任务
  2. 将所有任务放在列表中
  3. 无序播放列表(使用random.Shuffle)
  4. 将第一个任务标记为"正在进行"
  5. 将任务参数发送给客户端以完成

当客户端完成任务时。。。

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)

我不确定你正在使用的任何函数——这只是一个算法。

快乐编码!

最新更新