Django Celery初識

jeanron100發表於2018-03-28

對於任務排程的實現方案,其實開源的專案有很多。

我先說說對於任務排程的認識,如果從資料庫層面來說,任務排程就是scheduler,這一點在Oracle中體現的更為細緻。

Oracle中建立scheduler,在後臺執行JOB完成資料的處理,基本上會把一個任務拆分成不同的幾個維度屬性。

可以參考之前的一篇文章:

結合EM快速解決複雜的配置問題(r4筆記第91天)

而如果任務很多,有大批量的任務需要處理,而且任務位於不同的伺服器環境中,那麼這個複雜度就會大大增加,所以引入訊息佇列的方式就是一個很自然的方式。

訊息佇列目前有很多種可選方案,比如Redis,RabbitMQ等,根據自己的需求滿足要求即可。

首先我們需要確認celery已正常安裝。

>pip list|grep celery

celery (3.1.20)

celery-with-redis (3.0)

django-celery (3.2.2)

如果是在Django中在較新的版本中,也是自帶的,我們來快速體驗一下Django Celery的功能。

建立一個專案

django-admin startproject django_celery

初始化一個應用

cd django_celery

django-admin startapp celery_app

我們修改settings.py的配置。

在這裡需要說明的是,如果我們不用Redis,RabbitMQ的話,測試使用自帶的broker服務也是可以的。

如果啟用自帶的配置,settings.py的配置如下:

INSTALLED_APPS = (

'django.contrib.admin',

'django.contrib.auth',

'django.contrib.contenttypes',

'django.contrib.sessions',

'django.contrib.messages',

'django.contrib.staticfiles',

'celery_app',

'djcelery',

'kombu.transport.django',

)

BROKER_URL = 'django://localhost:8000//'

如果是用RabbitMQ,我們需要單獨部署安裝這個訊息佇列,可用

yum install rabbitmq-server即可,本身這個專案是用erlang開發的,所以會安裝大量的erlang相關的包。

Django Celery初識

settings.py的配置如下:

import djcelery

djcelery.setup_loader()

BROKER_URL= 'amqp://guest@localhost//'

CELERY_RESULT_BACKEND = 'amqp://guest@localhost//'

# Application definition

INSTALLED_APPS = (

'django.contrib.admin',

'django.contrib.auth',

'django.contrib.contenttypes',

'django.contrib.sessions',

'django.contrib.messages',

'django.contrib.staticfiles',

'celery_app',

'djcelery',

'kombu.transport.django',

)

然後我們配置任務的資訊,在django-celery專案目錄下,建立檔案celery.py

from __future__ import absolute_import

import os

from celery import Celery

from django.conf import settings

# set the default Django settings module for the 'celery' program.

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_celery.settings')

app = Celery('django_celery')

# Using a string here means the worker will not have to

# pickle the object when using Windows.

app.config_from_object('django.conf:settings')

app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

@app.task(bind=True)

def debug_task(self):

print('Request: {0!r}'.format(self.request))

在應用celery_app的目錄下,建立任務tasks.py,我們定義了幾個方法供呼叫。

from __future__ import absolute_import

from celery import shared_task

import time

@shared_task

def add(x, y):

return x + y

@shared_task

def mul(x, y):

time.sleep(10)

return x * y

@shared_task

def xsum(numbers):

time.sleep(10)

return sum(numbers)

基礎配置完成後,我們來試用一下。

然後配置DB的資訊,使用命令

python manage.py syncdb

這個過程會提示你建立一個超級使用者,照做就可以了。

啟動服務

python manage.py runserver

然後開啟另外一個視窗,啟動celery的服務

python manage.py celery worker -l info

這個過程很可能會跑出警告:

root@localhost django_celery]# python manage.py celery worker -l info

Running a worker with superuser privileges when the

worker accepts messages serialized with pickle is a very bad idea!

If you really want to continue then you have to set the C_FORCE_ROOT

environment variable (but please think about this before you do).

User information: uid=0 euid=0 gid=0 egid=0

其實這個意思很明確,如果確認需要,要設定變數C_FORCE_ROOT,風格和sandbox很類似。

export C_FORCE_ROOT=test

>python manage.py celery worker -l info

可以從啟動日誌看到task的資訊:

[tasks]

. celery_app.tasks.add

. celery_app.tasks.mul

. celery_app.tasks.xsum

. django_celery.celery.debug_task

再次開啟一個新的會話,這算是會話3,我們開啟shell互動視窗。

>>> from celery_app.tasks import *

>>> dir()

['__builtins__', 'absolute_import', 'add', 'mul', 'shared_task', 'xsum']

>>> mul(5,2)

10

這個時候如果使用delay,add的方式,就會進入訊息佇列。

>>> mul.delay(5,2)

<AsyncResult: 7d647a77-8344-4813-bc15-791ed1a8c3d3>

>>>

>>> add.delay(2,3)

<AsyncResult: 0408ed38-7537-458f-87de-8cae058123e2>

>>>

檢視worker的日誌資訊如下:

[2018-01-08 14:34:47,505: INFO/MainProcess] Received task: celery_app.tasks.add[bac53d49-24cf-4d07-8515-8eff8083cab9]

[2018-01-08 14:34:47,507: INFO/MainProcess] Task celery_app.tasks.add[bac53d49-24cf-4d07-8515-8eff8083cab9] succeeded in 0.0008037839998s: 6

使用RabbitMQ的日誌是類似的。

如果要啟用flower介面,也是分分鐘搞定。

安裝flower:

pip install flower

啟動服務

python manage.py celery flower

訪問埠:

http://127.0.0.1:5555/

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23718752/viewspace-2152362/,如需轉載,請註明出處,否則將追究法律責任。