web-dev-qa-db-ja.com

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_periodic」ではなく「celery」キューに送信します。どうすれば修正できますか?

追伸セロリ== 3.0.16

34
Artem Mezhenin

私はこの問題の解決策を見つけました:

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)celery_periodic paramsで@ periodic_taskに2回書き込んだ:

  • queue = 'celery_periodic'オプションは、コード(.delayまたは.apply_async)からタスクを呼び出すときに使用されます

  • options = {'queue': 'celery_periodic'}オプションは、celery beatが呼び出すときに使用されます。

確かに、CELERYBEAT_SCHEDULE変数を使用して定期的なタスクを構成する場合も、同じことが可能です。

UPD。 CELERYBEAT_SCHEDULERの場合、このソリューションは、DBベースのストレージとファイルベースのストレージの両方を修正します。

24
Artem Mezhenin

定期的にはcelerybeatによってキューに送信されます。Celeryapiで行うすべてのことを実行できます。これは、celerybeatに付属する構成のリストです。

http://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
    },
}
44
abhi shukla

また、djceleryデータベーススケジューラを使用している場合は、[実行オプション]-> [キュー]フィールドでキューを指定できます。

2
Mounir