1. 程式人生 > >django-celery的配置及使用

django-celery的配置及使用

Celery簡介

Celery 是一個 基於python開發的分散式非同步訊息任務佇列,通過它可以輕鬆的實現任務的非同步處理

celery的應用

非同步呼叫:那些使用者不關心的但是又存在在我們API裡面的操作 我們就可以用非同步呼叫的方式來優化(傳送郵件 或者上傳頭像)

​定時任務:定期去統計日誌,資料備份,或者其他的統計任務

相關概念

task:需要執行的任務

worker:負責幹活的小弟們

broker:結果存放的位置

celery的安裝和使用

pip install celery
pip install celery-with-redis
pip install django
-celery apt install redis-server
安裝

配置

ALLOWED_HOSTS = ['*']
INSTALLED_APPS = (
      ...
      'djcelery',
‘自己的APP’
    }
import djcelery
djcelery.setup_loader()
BROKER_URL='redis://localhost:6379/1'
CELERY_CONCURRENCY=2(設定worker的併發數量)
CELERY_RESULT_BACKEND = 'redis://localhost:6379/2
'
settings.py檔案

settings.py的同級目錄下新建celery.py

from __future__ import absolute_import #絕對路徑匯入
from celery import Celery
from django.conf import settings
import os

#設定系統的環境配置用的是Django的
os.environ.setdefault("DJANGO_SETTING_MODULE", "工程名字.settings")

#例項化celery
app = Celery('
mycelery') app.conf.timezone = "Asia/Shanghai" #指定celery的配置來源 用的是專案的配置檔案settings.py app.config_from_object("django.conf:settings") #讓celery 自動去發現我們的任務(task) app.autodiscover_tasks(lambda : settings.INSTALLED_APPS) #你需要在app目錄下 新建一個叫tasks.py(一定不要寫錯)檔案
celery.py

settings.py同級目錄下的init.py加入

from __future__ import absolute_import, unicode_literals
from .celery import app as celery_app
__init__.py

使用

1、在需要使用非同步任務的APP目錄下新建tasks.py

from celery import task
import time

@task
def hello_celery(loop):
    for i in range(loop):
        print 'hello'
        time.sleep(2)
tasks.py

2、views.py內的呼叫

任務函式名.delay(引數,,,,)

3、python manage.py migrate 建表(不要忘記建表)

4、啟動worker

python manage.py celery worker --loglevel=info (或者celery -A 你的工程名 worker -l info)

注意:修改tasks.py的內容後 要重啟celery的服務(命令:python manage.py celery worker --loglevel=info)

定時任務

在settings.py檔案新增
CELERYBEAT_SCHEDULE = {
    'schedule-test': {
        'task': 'app的名字.tasks.hello_celery',
        'schedule': timedelta(seconds=3),
        'args': (2,)
    },

}
settings.py

啟動: celery -A 你的工程名稱 beat -l info(或者python manage.py celery beat --loglevel=info)

計劃任務時間

from celery.schedules import crontab
crontab(minute=u'00', hour=u'11',day_of_week='mon,tue,wed,thu,sun')

示例如下:
 'every-week-three-and-four-run-get_data_with_param':{
        'task': 'APP的名字.tasks.get_data_with_param',
        'schedule': crontab(day_of_week="3, 4"),
        'args':(4, )
    }

注意:

我們啟動定時任務服務時 也要先開啟worker(python manage.py celery worker --loglevel=info)

​ 如果只開啟定時服務 沒有開啟worker服務 那麼定時任務會被放入任務佇列,但是由於沒有幹活兒的worker 那麼任務是不會被執行,當worker服務被啟動後 會立刻去任務佇列領任務並執行

#<分鐘> <小時> <日> <月份> <星期> <命令>

*/1    *    *    *    *    date>>a.txt

#用date>>~/crontest可以很清楚的看到測試的效果

5    *    *    *    *    ls

#指定每小時的第5分鐘執行一次ls命令

30    5    *    *     *    ls

#指定每天的 5:30 執行ls命令

30    7    8    *    *    ls

#指定每月8號的7:30分執行ls命令

30    5    8    6    *    ls

#指定每年的6月8日5:30執行ls命令

30    6    *    *    0    ls

#指定每星期日的6:30執行ls命令【注:0表示星期天,1表示星期1。星期也可以用英文來表示,sun表示星期天,mon表示星期一等。】

30    3    10,20    *    *    ls

#每月10號及20號的3:30執行ls命令【注:“,”用來連線多個不連續的時段】

25    8-11    *    *    *    ls

#每天8-11點的第25分鐘執行ls命令【注:“-”用來連線連續的時段】

*/15    *    *    *    *    ls

#每15分鐘執行一次ls命令【即每個小時的第0 15 30 45 60分鐘執行ls命令】

30    6    */10    *    *    ls

#每個月中,每隔10天6:30執行一次ls命令【即每月的1、11、21、31日是的6:30執行一次ls 命令。】

50    7    *    *    *    root    run-parts    /etc/cron.daily

#每天7:50以root 身份執行/etc/cron.daily目錄中的所有可執行檔案【注:run-parts引數表示執行後面目錄中的所有可執行檔案。】

重啟服務 :/etc/init.d/cron restart

計劃是分使用者的,只對當前使用者顯示

*/20 4 10,13 6-8 *
計劃任務