djcelery(django、celery)實現定時任務
- 啟動worker,beat,flower等常用命令
#Django下要檢視其他celery的命令,包括引數配置、啟動多worker程序的方式都可以通過help來檢視
python manage.py celery --help
# 啟動web服務
python manage.py runserver 172.xx.xx.xx:8000
# celery worker:(工人)啟動worker節點來處理任務
python manage.py celery worker -l info
# celery beat:(領導)啟動週期任務
python manage.py celery beat - l info
#Celery提供了一個工具flower,將各個任務的執行情況、各個worker的健康狀態進行監控並以視覺化的方式展現
#啟動視覺化flower
python manage.py celery flower --address=172.xx.xx.xx --port=5555#
#方便測試,同時啟動worker,beat
python manager.py celery worker -B -l info
- 安裝djcelery
#安裝
pip install djcelery
#同步資料庫
python manage.py makemigrations
python manage. py migrate
- djcelery配置
全域性配置檔案 settings.py
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'djcelery',#新增剛安裝的djcelery
)
……
import djcelery
from celery import platforms
from celery.schedules import crontab
from settings import djcerery_setting
djcelery.setup_loader()
#broker是代理人,它負責分發任務給worker去執行
BROKER_URL = 'redis://172.16.68.151:6379/6'
#匯入目標任務檔案
CELERY_IMPORTS = ('punch.tasks',)
#設定時區
CELERY_TIMEZONE = TIME_ZONE
## 定時任務排程器,表示使用了django-celery預設的資料庫排程模型,任務執行週期都被存在預設指定的orm資料庫中.
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
platforms.C_FORCE_ROOT = True
CELERYBEAT_SCHEDULE = {
'celery_test': {
"task": "appname.tasks.celery_test",
"schedule": crontab(minute='*', hour=12),
"args": (),
},
}
- 相關引數解釋
beat_schedule
task:需要執行的任務名稱
schedule:任務執行時間設定,可以是整秒數,一個timedelta物件,或者一個crontab物件,也可以自己實現。
args:一個元組或者列表,位置引數
kwargs:一個字典,關鍵字引數
options:一個字典,一些額外選項,apply_async()方法可用的引數,exchange, routing_key, expires等
relative:預設false
Crontab
class celery.schedules.crontab(minute=u'*', hour=u'*', day_of_week=u'*', day_of_month=u'*', month_of_year=u'*', **kwargs)
一個表示時間間隔的物件,語法與linux的crontab類似。
minute和hour可以設定為*/15,/2,分別表示每隔15分鐘和每隔2小時。
day_of_week用可以0-6的數字表示,也可以文字表示mon-fri。/2並不是每2天,而是每半天。
其中,crontab()例項化的時候沒設定任何引數,都是使用預設值。crontab一共有7個引數,常用有5個引數分別為:
minute:分鐘,範圍0-59;
hour:小時,範圍0-23;
day_of_week:星期幾,可以0-6的數字表示,也可以文字表示mon-fri。以星期天為開始,即0為星期天。這個星期幾還可以使用英文縮寫表示,例如“sun”表示星期天,*/2並不是每2天,而是每半天。;
day_of_month:每月第幾號,範圍1-31;
month_of_year:月份,範圍1-12。
官網一些具體例子:
crontab() 每分鐘
crontab(minute=0, hour=0) 每天的0時0分
crontab(minute=0, hour=’/3’) 每三小時
crontab(day_of_week=‘sunday’) 週日的每一小時
crontab(minute=’’,hour=’’, day_of_week=‘sun’) 與上面相同
crontab(minute=0, hour=’/3,8-17’) 每三個小時 8時到17時的每小時
- 建立任務
# coding=utf-8
from celery import task
from redis import StrictRedis
redis = StrictRedis(host='172.xx.xx.xxx', port=6379, db=0)
@task()
def celery_test():
print('------- celery_test--------')
- 參考
1.Django Celery定時任務和時間設定
(時間設定十分詳細,datetime、crontab)
https://www.cnblogs.com/dengshihuang/p/8258621.html
2.Django中使用Celery實現定時任務(用djcelery)
https://www.cnblogs.com/crb912/p/8976937.html
3.Celery(四)定時任務
https://www.cnblogs.com/linxiyue/archive/2017/12/21/8082102.html
4.基於Django+celery二次開發動態配置定時任務 ( 一 )
(包含記憶體洩漏的解決)
https://www.cnblogs.com/huangxiaoxue/p/7266253.html
5.Django中使用Celery實現定時任務(用djcelery)
(對於celery引數說的很詳細)
https://www.cnblogs.com/crb912/p/8976937.html