python - 如何在多个级别的用户之间平均共享资源

标签 python algorithm resources

问题: 有许多有限的作业可以一次处理。有多个用户共享这些资源(工作人员),目前还没有以平等方式共享资源的算法。

例子: 有来自 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/

相关文章:

java - 电子配置逻辑

javascript - 如何使用给定的 Angular 绘制不规则形状的多边形

cocoa - 什么是资源密集度较低的 : Bindings, KVO,或通知

python - 安装 gulp-converter-tjs 时找不到 Python 可执行文件

python - 如何估计 Pandas 的 DataFrame 需要多少内存?

c - 互补误差函数 erfcf() 的矢量化实现

c++ - fatal error CVT1100 : duplicate resource. 类型 :ICON, 名称 :1 (C++, Visual Studio C++ 2010)

android - getResources(R.string.hello_world) 和 R.string.hello_world 的区别

python - 如何获取Google YouTube API方法列表?

python - 在 Python 中停止线程池中的进程