首页 > 解决方案 > 芹菜工人公平地接受任务

问题描述

我正在研究芹菜工人。我有一些问题。

我使用 4 个 celery worker 并发 3。他们在做同样的工作。他们正在查看相同的队列。当我做任务时,我一次做4个任务。但每个任务需要不同的时间。它是这样的:

task_list = [task1,task2,task3,task4]
# task1 : takes 10s
# task2 : takes 30s
# task3 : takes 50s
# task4 : takes 70s

for task in task_list:
    result = current_app.send_task("task_queue",(task),)

它被发送到工作人员正在查看的同一队列。当我创建多组任务时,我期望这样:

Worker1: task1, task4,....
Worker2: task2, task3,...
Worker3: task3, task2,...
Worker4: task4, task1,...

这样每个工人的工作就足够了,但我实际经历的是:

Worker1: task1, task1, task1,....
Worker2: task2, task2, task2,...
Worker3: task3, task3, task3,...
Worker4: task4, task4, task4,...

由于这种情况,当一些工人努力工作时,其他工人什么也不做。我尝试为任务添加优先级,并为 celery worker 使用其他选项,但没有帮助。

这是我激活 celery worker 时的命令行。

celery -A django-project worker -n worker01 -Q task_queue -l DEBUG -O fair --prefetch-multiplier 1 --concurrency=3
celery -A django-project worker -n worker02 -Q task_queue -l DEBUG -O fair --prefetch-multiplier 1 --concurrency=3
celery -A django-project worker -n worker03 -Q task_queue -l DEBUG -O fair --prefetch-multiplier 1 --concurrency=3
celery -A django-project worker -n worker04 -Q task_queue -l DEBUG -O fair --prefetch-multiplier 1 --concurrency=3

有没有这样的情况,或者这种情况有什么解决方案?

标签: pythondjango

解决方案


此时,我所能做的就是将任务序列打乱到相同数量的任务可以去不同数量的工人

import random

...
task_list = [task1,task2,task3,task4]

random.shuffle(task_list)

for task in task_list:
    result = current_app.send_task("task_queue",(task),)

我希望我能找到另一种方式将任务公平地发送给工人


推荐阅读