我想用芹菜实现一个分布式作业执行系统。鉴于 rabbitMQ 不支持优先级并且我非常需要这个功能,所以我转向了 celery+redis。
在我的情况下,任务与硬件密切相关,例如,任务 A 只能在 Worker 1 上运行,因为只有 Worker 1 的 PC 拥有必要的硬件。我将每个工作人员的 CONCURRENCY 设置为 1,以便工作人员每次只运行一个任务。每个任务大约需要 2 分钟。
为了实现优先级功能,首先我尝试priority
在调用时添加参数apply_async()
,例如apply_async(priority=0)
and apply_async(priority=9)
。在这个测试中,我只启动了一个 COCURRENCY=1 的 Worker,并以不同的优先级一个一个地启动了 10 个任务。我希望看到启动的任务apply_async(priority=0)
将优先运行,但不幸的是它们只是作为启动顺序启动。
然后我尝试做一些工作。我克隆了每个任务,所以对于每个任务我都有 task_high 和 task_low,由@celery.task(priority=0)
and装饰@celery.task(priority=1)
。然后我做了和上面一样的测试,这次更好,当启动顺序是“HH-LLLL-HHHH”时,真正的顺序是“HH-LHHLHLLH”。我想redis在这里做了一些调度和平衡工作。
但这仍然不能满足我的期望。我希望得到像“HHHHHH-LLLL”这样的订单,因为对于某些任务,我只有一台合适的机器和必要的硬件,并希望高优先级的任务尽快运行。
我在 Internet 上搜索了其他工作,例如使用两个队列,一个用于高优先级任务,另一个用于低优先级任务,前者使用 2 台机器,后者使用 1 台机器。但由于我的硬件非常有限,这对我不起作用。
你能提出一些建议吗?