如何在多个级别上平等地共享用户之间的资源

时间:2018-04-21 09:16:05

标签: python algorithm resources

问题: 有许多有限的工作可以同时处理。有多个用户共享这些资源(工作者),此时没有算法以相同的方式共享资源。

实施例: 4个团队共有8名工作人员和4名用户,按此顺序要求每个团队有10个工作岗位。此时,处理以FIFO完成,第一个用户将占用所有工作人员,其他人必须等待很长时间。用户被分成几个小组。

到目前为止我的解决方案: 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行可能已在运行作业,其余行可以是待处理作业。我这样安排它们,所以每个人都会从左到右收到一个ticket_number,从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

我认为这种方法是正确的,但实现有点混乱,我正在寻找一种更简单的方法或可以保持代码清洁的算法。

编辑:问题是,如果有任何类型,如果现有的实现或类似想法的算法,我可以激发。

我希望我能尽可能清楚地表达问题。

1 个答案:

答案 0 :(得分:1)

我有点不确定究竟是什么问题,所以我只想抛弃一些想法。我认为你的队列正确。

如果您希望确保调度程序公平地从团队中选择工作,那么每个团队可以拥有一个队列。在实现方面,您需要一个每个团队队列的线程,该队列将项目从团队队列中取出并将其放入一个共享队列,该队列的最大大小为1,调度程序可以使用该队列。

另一方面,如果您希望在所有时间内公平地平衡各个团队的工作,您可以使用优先级队列并为每个团队分配计数器。每当项目被添加到队列中时,您从团队的计数器中获取下一个数字并将其用作优先级。这意味着如果你引入一个能够产生大量工作的新团队,那么它就会占用调度程序,直到它的计数器赶上其他团队。