问题: 有许多有限的作业可以一次处理。有多个用户共享这些资源(工作人员),目前还没有以平等方式共享资源的算法。
例子: 有来自 4 个团队的 8 个 worker 和 4 个用户,按此顺序每个团队请求 10 个工作。此时的处理是先进先出的,第一个用户会带走所有的 worker ,其他人需要等待很长时间。用户被分成小组。
到目前为止我的解决方案: 1. 每个团队最多可以拥有 1/(no_of_teams_with_jobs)*100%(如上,1/4*100 = 25%)。因此每个团队有 25% 的可用插槽 (8),即 2。 2. 2 个名额将由团队成员平分。
_________________________________________________________________________________________
| Worker 1 | Worker 2 | Worker 3 | Worker 4 | Worker 5 | Worker 6 | Worker 7 | Worker 8 |
-----------------------------------------------------------------------------------------
| Project 1 | Project 2 | Project 3 | Project 4 |
-----------------------------------------------------------------------------------------
0 | User 1 | User 1 | User 2 | User 2 | User 3 | User 3 | User 4 | User 4 |
1 | User 1 | User 1 | User 2 | User 2 | User 3 | User 3 | User 4 | User 4 |
2 | User 1 | User 1 | User 2 | User 2 | User 3 | User 3 | User 4 | User 4 |
3 | User 1 | User 1 | User 2 | User 2 | User 3 | User 3 | User 4 | User 4 |
因此第 0 行可能已经在运行作业,而其余行可能是待处理的作业。我这样安排他们,所以他们每个人都会收到一个从左到右的票号,从 1 到 n,这意味着将收到第一个空槽的顺序。
他们将收到的第二个数字是他们所在的线路,因为我需要计算持续时间的估计值。如果您在第 2 行,那么您可能会等待 2 个作业完成。
基本代码示例:
jobs = load_jobs()
jobs = compute_priority_and_estimate(jobs) # job.priority=x, job.estimate=seconds
persist_jobs_in_db(jobs)
然后在一个单独的进程中
jobs_to_process = load_jobs_to_process(free_slots=10) # order by job.priority ASC, limit 10
我认为这个方法是正确的,但是实现有点乱,我正在寻找一种更简单的方法或一种可以保持代码干净的算法。
编辑:问题是是否有任何类型的现有实现或类似想法的算法可以启发我。
我希望我能尽可能清楚地表达问题。
最佳答案
我有点不确定问题到底是什么,所以我只想抛出一些想法。我认为你在排队的正确轨道上。
如果您想确保调度程序公平地从各个团队中选择工作,您可以为每个团队设置一个队列。在实现方面,每个团队队列需要一个线程,该线程从团队队列中取出项目并将其放入共享队列中,该队列的最大大小为调度程序从中获取的工作。
另一方面,如果您想始终公平地平衡团队之间的工作,您可以使用优先级队列和每个团队的单独计数器。每当将一个项目添加到队列中时,您都会从团队的计数器中取出下一个数字并将其用于优先级。这意味着,如果您引入一个产生大量工作的新团队,它将占用调度程序,直到它的计数器 catch 其他团队。
关于python - 如何在多个级别的用户之间平均共享资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49954197/