优先级队列不适用于 Celery 和 RabbitMQ



我正在尝试在我的烧瓶应用程序中使用Celery 3.1.23RabbitMQ 3.6.11的优先级队列。但是这些任务不是由工人根据优先级来选择的。这是我的代码:

芹菜配置:

CELERYD_PREFETCH_MULTIPLIER = 1
CELERY_BROKER_URL = os.environ.get('CELERY_BROKER_URL', RABBITMQ_URL)
CELERY_RESULT_BACKEND = os.environ.get('CELERY_RESULT_BACKEND', REDIS_URL)
BROKER_POOL_LIMIT = int(os.environ.get('BROKER_POOL_LIMIT', 10))
CELERY_DEFAULT_QUEUE = 'non_web'
CELERY_IGNORE_RESULT = True
CELERY_ACKS_LATE = True
CELERY_SEND_EVENTS = False
CELERY_TASK_RESULT_EXPIRES = 3600
CELERY_RESULT_PERSISTENT = False
CELERY_TASK_QUEUES = (
    Queue('urgent', Exchange('urgent', type='direct'), routing_key='urgent', queue_arguments={'x-max-priority': 8}),
    Queue('web', Exchange('web', type='direct'), routing_key='web', queue_arguments={'x-max-priority': 6}),
    Queue('non_web', Exchange('non_web', type='direct'), routing_key='non_web', queue_arguments={'x-max-priority': 4}),
    Queue('background', Exchange('background', type='direct'), routing_key='background', queue_arguments={'x-max-priority': 2}),
)

在这里,我希望队列中排队的任务urgent优先级更高。然后是web,然后是non_web,最后是background队列。但是,在non-web中排队的任务始终首先执行。下面是作业的代码。

工作:

from time import sleep
@celery.task(queue='web', priority=8)
def high_priority_job():
    print 'High priority job'
    for i in range(1, 31):
        print i
        sleep(1)
@celery.task(queue='non_web', priority=6)
def medium_priority_job():
    print 'Medium priority job'
    for i in range(1, 31):
        print i
        sleep(1)

我尝试在这样的队列中排队作业:

def queue_jobs():
    for i in range(50):
        medium_priority_job.delay()
    for i in range(20):
        high_priority_job.delay()

在这种情况下,只有在完成所有中等优先级作业后,才会执行高优先级作业。我还尝试从作业声明中删除优先级,并在排队作业时进行设置,如下所示:

def queue_jobs():
    for i in range(50):
        medium_priority_job.apply_async(priority=6)
    for i in range(20):
        high_priority_job.apply_async(priority=8)

这也行不通。我尝试将芹菜升级到最新版本。这也无济于事。这是怎么回事?我需要更改任何设置吗?

难怪考虑到您在每种情况下都使用不同的队列,因此它们会定期执行。因此,要测试优先级使用情况,请使用单个队列,并将具有不同优先级的任务发送到该队列。

此外,当使用不同的经纪人时,优先级以及它们的含义也存在混淆 - 链接。

请注意,优先级值按相反的顺序排序:根据芹菜官方文档,0 表示最高优先级。https://docs.celeryproject.org/en/v4.3.0/userguide/routing.html

在您的情况下,medium_priority_job将首先执行,因为优先级为 6,接下来high_priority_job将执行正确的。

相关内容

  • 没有找到相关文章

最新更新