You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python将任务按工作量大致均分至多个job runner

按任务预估工作量均分至多个Runner的Python解决方案

要解决任务按工作量(而非数量)均分的问题,本质是处理多子集和近似分配场景,Python有现成工具和简洁实现可选,无需重复造轮子:

1. 用fairpy库实现专业公平分配

fairpy是专门针对公平分配问题的Python库,内置多种分配算法,能直接按任务权重(预估耗时)分配给多个runner。

先安装:

pip install fairpy

使用示例(适配你的任务格式):

from fairpy import divide

# 你的任务列表
tasks = [("job1", 10), ("job2", 30), ("job3", 20), ("job4", 40), ("job5", 15)]
# 转换为库要求的{任务: 权重}字典格式
task_weights = {job: est for job, est in tasks}

# 分给3个runner,用贪心算法(优先分配大任务到当前最轻负载的runner)
allocation = divide(task_weights, num_agents=3, algorithm="greedy")

# 转回原任务格式
runner_tasks = []
for runner_jobs in allocation.values():
    runner_tasks.append([(job, task_weights[job]) for job in runner_jobs])

# 查看结果
for idx, rt in enumerate(runner_tasks, 1):
    total_work = sum(est for _, est in rt)
    print(f"Runner {idx}: 总工作量={total_work}, 任务={rt}")

该库的贪心算法能快速得到近似最优的均衡分配结果,适合需要专业分配逻辑的场景。

2. 无依赖轻量实现

如果不想引入第三方库,经典的贪心策略几行代码就能搞定,这也是多数工具的底层逻辑:

def split_by_workload(tasks, num_runners):
    # 按预估工作量降序排序,优先处理大任务
    sorted_tasks = sorted(tasks, key=lambda x: x[1], reverse=True)
    # 初始化每个runner的任务列表和累计工作量
    runners = [[[], 0] for _ in range(num_runners)]
    
    for job, est in sorted_tasks:
        # 找到当前累计工作量最小的runner
        min_runner = min(runners, key=lambda x: x[1])
        min_runner[0].append((job, est))
        min_runner[1] += est
    
    # 返回仅含任务列表的结果
    return [r[0] for r in runners]

# 示例调用
tasks = [("job1", 10), ("job2", 30), ("job3", 20), ("job4", 40), ("job5", 15)]
result = split_by_workload(tasks, 3)

for idx, rt in enumerate(result, 1):
    total_work = sum(est for _, est in rt)
    print(f"Runner {idx}: 总工作量={total_work}, 任务={rt}")

这种实现高效且无依赖,对大多数日常场景完全够用。

关键说明

  • 以上方法都是近似最优解:多子集和问题属于NP难问题,不存在多项式时间的精确最优解法,但贪心策略在实际场景中已经能达到足够均衡的效果。
  • 如果任务预估耗时误差较大,建议结合实时监控做动态负载调整,比如将长时间运行的任务拆分或迁移到空闲runner。

内容的提问来源于stack exchange,提问作者DiB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 07:06:21