在我们的服务上,用户可以添加不同的任务,只要有空位就可以执行这些任务。
所有任务都存储在mysql表中。桌子看起来像
user_id | task | status | created_at | started_at
int | string | pending,active | datetime | datetime
我们当前正在使用fifo策略,但是由于任务数量在增加,并且我们不想增加用户可以添加的任务数量的限制,因此我们想为其添加公平的广告位策略。通常,任务在完成前需要运行30至75分钟。也可以更少或更多。
我创建了一组示例数据:
示例数据:
158 total tasks
144 pending tasks
14 running tasks
15 tasks can run at the same time
# of pending tasks for each user
user 1 => 28 tasks
user 2 => 76 tasks
user 3 => 5 tasks
user 4 => 22 tasks
user 5 => 3 tasks
# of active tasks for each user
user 1 => 5 tasks
user 2 => 0 tasks
user 3 => 2 tasks
user 4 => 4 tasks
user 5 => 3 tasks
我的方法是
-first:将每个用户的待处理任务数除以总待处理任务数(pending_tasks_of_user_x / pending_tasks)。
-second:然后将活动任务划分为可以同时运行的任务数量(active_tasks_of_user_x / current_tasks)。
但是现在我不知道如何进行。如果我的方法是完全错误的,那么我会接受的。
要使用php访问数据库。
编辑:
公平地说,我定义用户不必等待其他用户的所有其他任务完成。例如,用户2有76个任务,而用户1有28个任务。现在,用户5添加了3个任务。我不希望用户5必须等到必须先执行用户1和2的所有任务才能执行用户5的任务。更像是用户2可以一次运行8个任务,用户1 4和用户5可以一次运行2,或者类似。如果可用的用户多于并发任务,则它应相应地缩小,并且有些必须等待。
答案 0 :(得分:0)
在这种情况下,我认为Fair-share scheduling是个好方法。
将可用任务槽的总数除以具有待处理任务的用户总数。
15/5 = 3
每个用户现在可以一次运行3个任务。
这意味着任务少的用户将很快完成,任务多的用户必须等待更长的时间。
如果出现另一个用户,则可用任务将为
15/6 = 2.5
您当然不能运行一半的任务,但是可以通过实际的排队算法解决。
我认为您可以在PHP中实现它。我认为这不是为您编写代码的地方。
算法应如下所示:
这是实现此目标所需要做的。