Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用redis实现芹菜中的任务优先级_Python_Celery_Distributed - Fatal编程技术网

Python 用redis实现芹菜中的任务优先级

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

我想用芹菜实现一个分布式作业执行系统。考虑到rabbitMQ不支持优先级,并且我非常需要这个功能,我转向芹菜+redis

在我的情况下,任务与硬件密切相关,例如,任务A只能在Worker 1上运行,因为只有Worker 1的PC具有必要的硬件。我将每个工人的并发性设置为1,这样工人每次只运行一个任务。每个任务大约需要2分钟

为了实现优先级特性,首先我尝试在调用
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
  • 调用任务, 0为最高优先级,9为最低优先级
  • 自定义_优先级=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',
    }