簡體   English   中英

如何將周期性任務發送到 Celery 中的特定隊列

[英]How to send periodic tasks to specific queue in Celery

默認情況下,Celery 將所有任務發送到“celery”隊列,但您可以通過添加額外參數來更改此行為:

@task(queue='celery_periodic')
def recalc_last_hour():
    log.debug('sending new task')
    recalc_hour.delay(datetime(2013, 1, 1, 2)) # for example

調度程序設置:

CELERYBEAT_SCHEDULE = {
   'installer_recalc_hour': {
        'task': 'stats.installer.tasks.recalc_last_hour',
        'schedule': 15  # every 15 sec for test
    },
}
CELERYBEAT_SCHEDULER = "djcelery.schedulers.DatabaseScheduler"

運行工人:

python manage.py celery worker -c 1 -Q celery_periodic -B -E

這個方案沒有按預期工作:這個工作人員將周期性任務發送到“celery”隊列,而不是“celery_periodic”。 我該如何解決?

PS芹菜==3.0.16

周期性任務通過 celery beat 發送到隊列中,您可以在其中執行使用 Celery API 執行的所有操作。 以下是 celery beat 附帶的配置列表:

https://celery.readthedocs.org/en/latest/userguide/periodic-tasks.html#available-fields

在你的情況下:

CELERYBEAT_SCHEDULE = {
   'installer_recalc_hour': {
        'task': 'stats.installer.tasks.recalc_last_hour',
        'schedule': 15,  # every 15 sec for test
        'options': {'queue' : 'celery_periodic'},  # options are mapped to apply_async options
    },
}

我找到了解決這個問題的方法:

1)首先我改變了配置周期任務的方式。 我像這樣使用@periodic_task裝飾器:

@periodic_task(run_every=crontab(minute='5'),
               queue='celery_periodic',
               options={'queue': 'celery_periodic'})
def recalc_last_hour():
    dt = datetime.utcnow()
    prev_hour = datetime(dt.year, dt.month, dt.day, dt.hour) \
                - timedelta(hours=1)
    log.debug('Generating task for hour %s', str(prev_hour))
    recalc_hour.delay(prev_hour)

2)我在@periodic_task的參數中寫兩次celery_periodic

  • 當您從代碼(.delay 或 .apply_async)調用任務時使用queue='celery_periodic'選項

  • options={'queue': 'celery_periodic'}選項在celery beat調用時使用。

我敢肯定,如果你用 CELERYBEAT_SCHEDULE 變量配置周期性任務,同樣的事情是可能的。

更新。 此解決方案適用於CELERYBEAT_SCHEDULER 的基於數據庫和基於文件的存儲。

如果您使用的是 djcelery 數據庫調度程序,則可以在 Execution Options -> queue 字段中指定隊列

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM