问题: 有许多有限的工作可以同时处理。有多个用户共享这些资源(工作者),此时没有算法以相同的方式共享资源。
实施例: 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
我认为这种方法是正确的,但实现有点混乱,我正在寻找一种更简单的方法或可以保持代码清洁的算法。
编辑:问题是,如果有任何类型,如果现有的实现或类似想法的算法,我可以激发。
我希望我能尽可能清楚地表达问题。
答案 0 :(得分:1)
我有点不确定究竟是什么问题,所以我只想抛弃一些想法。我认为你的队列正确。
如果您希望确保调度程序公平地从团队中选择工作,那么每个团队可以拥有一个队列。在实现方面,您需要一个每个团队队列的线程,该队列将项目从团队队列中取出并将其放入一个共享队列,该队列的最大大小为1,调度程序可以使用该队列。
另一方面,如果您希望在所有时间内公平地平衡各个团队的工作,您可以使用优先级队列并为每个团队分配计数器。每当项目被添加到队列中时,您从团队的计数器中获取下一个数字并将其用作优先级。这意味着如果你引入一个能够产生大量工作的新团队,那么它就会占用调度程序,直到它的计数器赶上其他团队。