python - 芹菜工人公平地接受任务
问题描述
我正在研究芹菜工人。我有一些问题。
我使用 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
有没有这样的情况,或者这种情况有什么解决方案?
解决方案
此时,我所能做的就是将任务序列打乱到相同数量的任务可以去不同数量的工人
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),)
我希望我能找到另一种方式将任务公平地发送给工人
推荐阅读
- python - 使用参数为 django 管理命令运行 crontab
- javascript - 如何修复无法读取 null 的属性“clientWidth”?
- android - 在 Android 应用程序的 TCP 套接字上设置 TCP keep_alive 属性时出现“连接超时”错误
- r - 使用 sqlQuery 将 R 中的 RODBC 插入性能(非常慢)插入 ORACLE 数据库
- python - 使用 Opencv Python 调整图像大小并保持质量
- kotlin - Kotlin 协程 Mutex 所有者使用
- json - 解析 JSON 以转换为模型类
- ruby-on-rails - AWS 错误:未配置“生产”数据库
- html - Thymeleaf 表行划分为单独的页面
- angular - 如何使用 angular 中的 highcharts 创建如下图