我想用芹菜实现一个分布式作业执行系统.鉴于rabbitMQ不支持优先级,我很痛苦地需要这个功能,我转向celery + redis.
在我的情况下,任务与硬件密切相关,例如,任务A只能在Worker 1上运行,因为只有Worker 1的PC才能获得必要的硬件.我将每个worker的CONCURRENCY设置为1,这样一个worker每次只能运行一个任务.每项任务大约需要2分钟.
为了实现优先级功能,首先我尝试priority在调用时添加参数apply_async(),例如apply_async(priority=0)和apply_async(priority=9).在这个测试中,我只启动了一个COCURRENCY = 1的Worker,并以不同的优先级逐个启动了10个任务.我希望看到任务开始apply_async(priority=0)将优先运行,但不幸的是,它们刚刚开始作为启动命令.
然后我尝试做一些工作.我克隆了每个任务,所以对于每一个我都有task_high和task_low,由@celery.task(priority=0)和装饰@celery.task(priority=1).然后我做了与上面相同的测试,这次它更好,当开球顺序是"HH-LLLL-HHHH"时,真正的顺序是"HH-LHHLHLLH".我想redis在这里做了一些调度和平衡工作.
但这仍然不能满足我的期望.我希望得到像"HHHHHH-LLLL"这样的订单,因为对于某些任务,我只有一台带有必要硬件的合适机器,并希望尽快运行高优先级任务.
我在互联网上搜索了其他工作,例如使用两个队列,一个用于高优先级任务,另一个用于低优先级,前者使用2台机器,后者使用1台机器.但由于我的硬件非常有限,这对我不起作用.
你能提一些建议吗?
ask*_*sol 16
Celery Redis运输确实尊重优先领域,但Redis本身并没有优先考虑的概念.
通过为每个队列创建n个列表并在BRPOP命令中使用该顺序来实现优先级支持.我n在这里说是因为即使有10(0-9)个优先级,默认情况下这些优先级合并为4级以节省资源.这意味着命名的队列celery将真正分成4个队列:
['celery0', 'celery3`, `celery6`, `celery9`]
Run Code Online (Sandbox Code Playgroud)
如果您想要更多优先级,可以设置priority_steps传输选项:
BROKER_TRANSPORT_OPTIONS = {
'priority_steps': list(range(10)),
}
Run Code Online (Sandbox Code Playgroud)
也就是说,请注意,这永远不会像在服务器级别实现的优先级那样好,并且可能是最近的近似值.但它可能仍然适合您的应用程序.
| 归档时间: |
|
| 查看次数: |
6017 次 |
| 最近记录: |