我正在尝试在我的烧瓶应用程序中使用Celery 3.1.23和RabbitMQ 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
将执行正确的。