Python 用redis实现芹菜中的任务优先级
我想用芹菜实现一个分布式作业执行系统。考虑到rabbitMQ不支持优先级,并且我非常需要这个功能,我转向芹菜+redis 在我的情况下,任务与硬件密切相关,例如,任务A只能在Worker 1上运行,因为只有Worker 1的PC具有必要的硬件。我将每个工人的并发性设置为1,这样工人每次只运行一个任务。每个任务大约需要2分钟 为了实现优先级特性,首先我尝试在调用Python 用redis实现芹菜中的任务优先级,python,celery,distributed,Python,Celery,Distributed,我想用芹菜实现一个分布式作业执行系统。考虑到rabbitMQ不支持优先级,并且我非常需要这个功能,我转向芹菜+redis 在我的情况下,任务与硬件密切相关,例如,任务A只能在Worker 1上运行,因为只有Worker 1的PC具有必要的硬件。我将每个工人的并发性设置为1,这样工人每次只运行一个任务。每个任务大约需要2分钟 为了实现优先级特性,首先我尝试在调用apply\u async()时添加priority参数,例如apply\u async(priority=0)和apply\u asyn
apply\u async()
时添加priority
参数,例如apply\u async(priority=0)
和apply\u async(priority=9)
。在这个测试中,我只启动了一个COCURRENCY=1的Worker,并以不同的优先级逐个启动了10项任务。我希望看到由apply\u async(priority=0)启动的任务将以优先级运行,但不幸的是,它们只是按照启动顺序启动的
然后我试着做一些工作。我克隆了每个任务,因此对于每个任务,我有task\u high和task\u low,由@芹菜.task(优先级=0)
和@芹菜.task(优先级=1)
装饰。然后我做了与上面相同的测试,这次更好,当开球顺序是“HH-LLLL-hhh”时,真正的顺序是“HH-L-H-H-L-H-L-L-H”。我想redis在这里做了一些安排和平衡工作
但这仍然不能满足我的期望。我希望得到像“hhhhhhhllll”这样的订单,因为对于某些任务,我只有一台配备必要硬件的合适机器,希望高优先级任务尽快运行
我在互联网上搜索了其他解决方案,例如使用两个队列,一个用于高优先级任务,另一个用于低优先级任务,前者使用两台机器,后者使用一台机器。但由于我的硬件非常有限,这对我来说不起作用
你能给我一些建议吗?芹菜Redis transport确实尊重优先领域,
但Redis本身没有优先权的概念
优先级支持是通过为每个队列创建n个列表来实现的
并在BRPOP命令中使用该顺序。
我在这里说n
,因为即使有10(0-9)个优先级,它们都是
默认情况下合并为4个级别以节省资源。
这意味着名为芹菜
的队列实际上将被分成4个队列:
['celery0', 'celery3`, `celery6`, `celery9`]
如果需要更高的优先级,可以设置优先级\u步骤
传输选项:
BROKER_TRANSPORT_OPTIONS = {
'priority_steps': list(range(10)),
}
尽管如此,请注意,这永远不会像优先事项那样好
在服务器级别,最多可能是近似值。但它可能仍然是好的
对于您的应用程序来说已经足够了。这里有关于redis消息优先级的芹菜文档,您可以自定义优先级级别。以10为例:
设置“优先级\步骤”传输选项
以正常方式启动芹菜工人
西芹-任务工作者--loglevel=info
自定义_优先级=5
task.apply_async(args=[arg1,arg2],kwargs={'kwarg1':'x','kwarg2':'y'},priority=custom_priority)
谢谢您提供的详细信息,但是我该怎么做才能得到我想要的订单呢?我是否应该更改优先级\u步骤
?您只需尝试一下即可。使用默认的优先级步骤,这些0和1将被合并为0。好的,谢谢,我尝试了优先级为0的任务高,优先级为9的任务低,现在看起来好多了,尽管有时优先级为9的任务仍然比优先级为0的任务先运行。我不知道我的配置是否有问题,或者是redis做了一些平衡工作。正如我所说,只要不在服务器上实现优先级,它就不完全可靠
app.conf.broker_transport_options = {
'priority_steps': list(range(10)),
'queue_order_strategy': 'priority',
}