簡體   English   中英

芹菜節拍開始時運行芹菜任務

[英]Running celery task when celery beat starts

我如何安排任務在我開始 celery beat 時運行,然后在 1 小時內再次運行,等等。

目前我在 settings.py 中有時間表:

CELERYBEAT_SCHEDULE = {
    'update_database': {
        'task': 'myapp.tasks.update_database',
        'schedule': timedelta(seconds=60),
    },
}

我在 stackoverflow 上看到了 1 年的帖子,提出了同樣的問題: 如何立即運行 celery schedule?

但是這對我不起作用,因為當我運行 django 服務器時,我的芹菜工人收到 3-4 個相同任務的請求

我正在開始我的工人並像這樣節拍:

celery -A dashboard_web worker -B --loglevel=INFO --concurrency=10

Crontab 時間表

您可以嘗試使用crontab計划,該計划將每小時運行一次,並在計划程序初始化后 1 分鍾開始。 警告:您可能希望在幾分鍾后執行此操作,以防啟動需要更長的時間,否則您可能需要等待整整一個小時。

from celery.schedules import crontab
from datetime import datetime

CELERYBEAT_SCHEDULE = {
    'update_database': {
        'task': 'myapp.tasks.update_database',
        'schedule': crontab(minute=(datetime.now().minute + 1) % 60),
    },
}

參考: http : //docs.celeryproject.org/en/latest/userguide/periodic-tasks.html#crontab-schedules

MyAppConfig 的就緒方法

為了確保您的任務立即運行,您可以使用與之前相同的方法創建周期任務,而無需將1添加到minute 然后,您在MyAppConfigready方法中調用您的任務,只要您的應用程序准備就緒,就會調用該方法。

#myapp/apps.py

class MyAppConfig(AppConfig):
    name = "myapp"

    def ready(self):
        from .tasks import update_database
        update_database.delay()

請注意,如果您要使用django_celery_beat ,您也可以直接在ready方法中創建周期性任務。

編輯:沒有看到您提到的鏈接中已經涵蓋了第二種方法。 我會把它留在這里,以防它對到達這里的其他人有用。

嘗試設置配置參數CELERY_ALWAYS_EAGER = True

像這樣的東西

app.conf.CELERY_ALWAYS_EAGER = True

暫無
暫無

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

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