我正在尝试使用Celery实现以下方案:两个(相同)长时间运行任务的队列,一个用于"正常",另一个用于"空闲"优先级.
我让工作人员监视两个队列并首先从"正常"优先级队列中获取任务,如果它是空的,它将从"空闲"优先级中获取任务.
我的问题是:是否有可能保证工人检查任务排队的顺序?此外,这是实施优先事项的正确方法吗?
背景:任务正在运行ffmpeg转码作业."正常"优先级将是新视频(必须尽快转码),"空闲"优先级将是将旧(40.000+视频)存档重新转码为更新格式设置的任务.我没有多个服务器可用于执行多服务器任务调度.
在我的python应用程序中,我使用Celery作为任务生产者和消费者,使用RabbitMQ作为经纪人.现在,我正在实施优先级.起初,它看起来根本不起作用,因为根据文档,我刚刚x-max-priority为队列添加了参数.我更深入地查看,并且我发现了另一个优先级 - 消费者优先级和任务优先级.所以,现在看起来有三种不同的优先级,我完全糊涂了.你能解释一下我的区别吗?
队列最高优先级:viz https://www.rabbitmq.com/priority.html
Queue('my_queue', exchange=Exchange('my_queue'), routing_key='my_queue', queue_arguments={'maxPriority': 10})
Run Code Online (Sandbox Code Playgroud)
消费者优先权:viz https://www.rabbitmq.com/consumer-priority.html
Queue('my_queue', exchange=Exchange('my_queue'), routing_key='my_queue', consumer_arguments={'priority': 10})
Run Code Online (Sandbox Code Playgroud)
任务优先级:viz https://github.com/celery/celery/issues/2635#issuecomment-173597053
my_task.apply_async(args=(arg1, arg2), priority=6)
Run Code Online (Sandbox Code Playgroud)
谢谢.
经过更多研究后编辑:
正如我在阅读后所理解的那样:
队列最大优先级是一种限制,并告诉该队列仅侦听优先级设置为max max到此参数的任务.但是优先级更高的任务呢?队列是否优先于自身最大定义?忽略它们?
消费者优先权看起来像消费者的优先次序.如果有两个具有不同优先级的消费者且两者都是免费的,则消费消息的第一个消费者是具有更高优先级的消费者.但是为什么它用Queue定义而不是消费者本身?
任务优先级应该是优先级,这对我的需求最重要.它告诉我应该以给定的优先级读取此消息.
因此,看起来最好的优先级将通过将所有优先级与多个worker和并发设置为1的组合来实现,而不是一个具有更高并发性且具有worker_prefetch_multiplier和task_acks_late配置的worker .
你怎么看?是对的吗?