我有一台机器接受用户上传,对它们执行一些处理,然后返回结果。通常需要几分钟来处理收到的每个上传。
问题是,一些用户可以上传很多基本上拒绝处理其他用户的工作。我想过设置硬盘并使用优先级队列,例如在一小时内上传5次后,所有新上传的处理优先级都会降低。我基本上想要处理所有工作,但我不希望上传1000个工作的用户让所有人等待。
我的问题是,有更好的方法吗?
我的目标是尽量缩短上传和返回结果之间的时间。如果算法也能以分布式方式工作,那将是理想的。
由于
答案 0 :(得分:5)
实施情况会有很大差异,具体取决于这些工作的内容,工作时间,处理时间的差异,以及在此过程中发生致命错误的可能性。
话虽这么说,维护用户均匀分配工作的一种简单方法是维护已提交作业的所有用户的列表。当您准备好获得一份新工作时,不要只是从随机队列中取出下一份工作,而是每次从每个用户中获取最高职位的用户进行循环。
同样,这可以通过多种方式实现,我会建议从用户到各自提交的作业列表的地图。每次准备好新工作时,都要遍历地图的键。然后获取你所在的任何键的工作列表,并完成第一份工作。
这假设每个作业都是“原子”的,因为一个作业不依赖于在其提交的作业旁边执行。
希望有所帮助,当然我可能完全误解了你的要求。
答案 1 :(得分:1)
你不需要自己动手。有Sun Grid Engine。一个开源工具,用来做这种事情,如果你愿意付钱,我会在工作中使用Platform LSF。
答案 2 :(得分:0)
用户可以提交的最大作业数是多少?用户可以一次提交1份工作还是一批工作?
所以你的算法会像这样
If the User has submitted jobs Then
Check how many jobs per hour
If the jobs per hour > than the average Then
Modify the users profile to a lower priority
Else
Check Users priority level and restore
End If
If the priority = HIGH
process right away
Else If priority = MEDIUM
Check Queue for High Priority
If High Priority Found (rerun this loop)
Else Process
Else If priority = LOW
Check Queue for High Priority
If High Priority Found (rerun this loop)
Else Process
Check Queue for Medium Priority
If Medium Priority Found (rerun this loop)
Else Process
Process Queue
End If
答案 3 :(得分:0)
您可以使用Edmond的Blossom V等图形算法将所有用户和作业分配给流程。如果用户可以上传更多用户,那么他找到一个进程会更简单。使用Blossom V算法,您可以定义一个阈值,使其不超过服务器可以处理的最大进程。