版本: | 2.7.0 |
---|---|
網址: | http://django-celery-beat.readthedocs.io/ |
下載: | http://pypi.python.org/pypi/django-celery-beat |
來源: | http://github.com/celery/django-celery-beat |
關鍵字: | django、celery、beat、週期性任務、cron、調度 |
此擴充功能使您能夠將定期任務計劃儲存在資料庫中。
可以從 Django 管理介面管理定期任務,您可以在其中建立、編輯和刪除定期任務以及它們的運行頻率。
此擴充功能的使用和安裝說明可從 Celery 文件中取得。
警告
如果您變更 Django TIME_ZONE
設置,您的定期任務計劃仍將基於舊時區。
要解決此問題,您必須重置每個定期任務的「上次運行時間」:
>> > from django_celery_beat . models import PeriodicTask , PeriodicTasks
>> > PeriodicTask . objects . all (). update ( last_run_at = None )
>> > PeriodicTasks . update_changed ()
筆記
這將重置狀態,就好像定期任務以前從未運行過一樣。
django_celery_beat.models.PeriodicTask
該模型定義了要運行的單一週期性任務。
它必須與計劃關聯,該計劃定義任務運行的頻率。
django_celery_beat.models.IntervalSchedule
以特定間隔(例如每 5 秒)運行的計劃。
django_celery_beat.models.CrontabSchedule
包含諸如 cron 中的條目之類的欄位的計劃: minute hour day-of-week day_of_month month_of_year
。
django_celery_beat.models.PeriodicTasks
該模型僅用作追蹤時間表何時更改的索引。
每當您更新PeriodicTask
時,該表中的計數器也會增加,這會告訴celery beat
服務從資料庫重新載入計劃。
如果批次更新定期任務,則需要手動更新計數器:
>> > from django_celery_beat . models import PeriodicTasks
>> > PeriodicTasks . update_changed ()
若要建立以一定時間間隔執行的週期性任務,您必須先建立時間間隔物件:
>> > from django_celery_beat . models import PeriodicTask , IntervalSchedule
# executes every 10 seconds.
>> > schedule , created = IntervalSchedule . objects . get_or_create (
... every = 10 ,
... period = IntervalSchedule . SECONDS ,
... )
這就是您需要的所有欄位:週期類型和頻率。
您可以在一組特定的期間之間進行選擇:
IntervalSchedule.DAYS
IntervalSchedule.HOURS
IntervalSchedule.MINUTES
IntervalSchedule.SECONDS
IntervalSchedule.MICROSECONDS
筆記
如果您有多個每 10 秒執行一次的定期任務,那麼它們都應該指向同一個調度物件。
如果您需要將其呈現給用戶,也可以使用「選擇元組」:
>> > IntervalSchedule . PERIOD_CHOICES
現在我們已經定義了調度對象,我們可以建立週期性任務條目:
>> > PeriodicTask . objects . create (
... interval = schedule , # we created this above.
... name = 'Importing contacts' , # simply describes this periodic task.
... task = 'proj.tasks.import_contacts' , # name of task.
... )
請注意,這是一個非常基本的範例,您還可以指定用於執行任務的參數和關鍵字參數、將其傳送到[*]的queue
,並設定到期時間。
以下是指定參數的範例,請注意 JSON 序列化的要求:
>> > import json
>> > from datetime import datetime , timedelta
>> > PeriodicTask . objects . create (
... interval = schedule , # we created this above.
... name = 'Importing contacts' , # simply describes this periodic task.
... task = 'proj.tasks.import_contacts' , # name of task.
... args = json . dumps ([ 'arg1' , 'arg2' ]),
... kwargs = json . dumps ({
... 'be_careful' : True ,
... }),
... expires = datetime . utcnow () + timedelta ( seconds = 30 )
... )
[*] | 您也可以使用exchange 和routing_key 欄位來使用低階AMQP路由。 |
crontab 計畫有以下欄位: minute
、 hour
、 day_of_week
、 day_of_month
和month_of_year
,因此,如果您想要相當於30 * * * *
(每小時執行 30 分鐘)的 crontab 條目,您可以指定:
>> > from django_celery_beat . models import CrontabSchedule , PeriodicTask
>> > schedule , _ = CrontabSchedule . objects . get_or_create (
... minute = '30' ,
... hour = '*' ,
... day_of_week = '*' ,
... day_of_month = '*' ,
... month_of_year = '*' ,
... timezone = zoneinfo . ZoneInfo ( 'Canada/Pacific' )
... )
crontab 計畫使用「timezone」輸入參數連結到特定時區。
然後,若要使用此計劃建立定期任務,請使用與本文檔前面基於時間間隔的定期任務相同的方法,但不指定interval=schedule
,而是指定crontab=schedule
:
>> > PeriodicTask . objects . create (
... crontab = schedule ,
... name = 'Importing contacts' ,
... task = 'proj.tasks.import_contacts' ,
... )
您可以使用enabled
標誌暫時停用週期性任務:
>> > periodic_task . enabled = False
>> > periodic_task . save ()
週期性任務仍然需要「工人」來執行。因此請確保安裝了預設的Celery套件。 (如果未安裝,請按照此處的安裝說明進行操作:https://github.com/celery/celery)
Worker 和 Beat 服務需要同時運作。
啟動 Celery 工作服務(指定您的 Django 專案名稱):
$ celery -A [專案名稱] 工人 --loglevel=info
作為一個單獨的進程,啟動beat服務(指定Django調度程序):
$ celery -A [專案名稱]beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler
或者您可以使用 -S (調度程序標誌),有關更多選項,請參閱celery beat --help
):
$ celery -A [專案名稱]beat -l info -S django
另外,作為一種替代方案,您可以只使用一個命令來執行上述兩個步驟(worker 和beat 服務)(建議僅用於開發環境):
$ celery -A [專案名稱]worker --beat --scheduler django --loglevel=info
現在您可以從 Django 管理介面新增和管理定期任務。
您可以透過 Python 套件索引 (PyPI) 或從原始碼安裝 django-celery-beat。
使用pip
安裝:
$ pip install --upgrade django-celery-beat
從 http://pypi.python.org/pypi/django-celery-beat 下載最新版本的 django-celery-beat
您可以透過執行以下操作來安裝它:
$ python3 -m venv .venv
$ source .venv/bin/activate
$ pip install --upgrade build pip
$ tar xvfz django-celery-beat-0.0.0.tar.gz
$ cd django-celery-beat-0.0.0
$ python -m build
$ pip install --upgrade .
安裝後,將django_celery_beat
加入 Django 的設定模組中:
INSTALLED_APPS = [
...,
'django_celery_beat' ,
]
使用以下指令執行django_celery_beat
遷移:
$ python manage.py migrate django_celery_beat
您可以使用以下 pip 指令安裝 django-celery-beat 的最新主版本:
$ pip install git+https://github.com/celery/django-celery-beat#egg=django-celery-beat
若要使用 Django admin 在 http://127.0.0.1:58000/admin/ 啟動 django-celery-beat 的本機開發副本,請執行:
$ docker-compose up --build
以使用者admin
和密碼admin
身分登入。
如果您的專案不支援時區,則可以在設定檔中設定DJANGO_CELERY_BEAT_TZ_AWARE=False
。
django-celery-beat 和數千個其他軟體包的維護者正在與 Tidelift 合作,為您用於建立應用程式的開源依賴項提供商業支援和維護。節省時間、降低風險並改善程式碼運作狀況,同時向您使用的確切依賴項的維護者付費。了解更多。