1. 程式人生 > >djcelery(django、celery)實現定時任務

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時的每小時

  • 建立任務

app下建立task.py

# 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