1:Celery简介
1.1 异步任务,假设用户发起一个request,并等待request返回。但是在request 经过django一层层处理到达我们的view时,view要进行一次比较耗时的操作,比如分析日志文件或者发起一个http请求。这些操作耗时无法确定,这样我们的API接口的响应时间就无法预知了。为了给用户以良好的体验,我们应该把这种耗时的任务放在后台处理。
1.2 定时任务,之前遇到一个需求是这样的。根据Django的日志数据分析用户的访问习惯和页面访问次数。这种任务不可能在用的时候再去分析统计,那肯定来不及了。所以需要在每天零点整自动分析这些日志。当遇到这种问题时我们可以采用Celery的定时任务。当然还有另一种解决方案,自定义Django Command 然后用shell脚本执行。然后添加到系统定时任(crontab)务里。
2:在本系统中的应用有两点
(1)中毒IP自动控制(定时任务)
(2)在通过黑名单页面手动恢复IP通信(异步任务)
3:Django+Celery 安装
pip install django
pip install celery
pip install django-celery
4:settings.py
(1)
Celery代理人(broker), 我们使用Django database broker implementation. 现在我们只需要知道Celery需要broker, 使用django自身便可以充当broker. (但在部署时, 我们最好使用更稳定和高效的broker, 例如Redis.)
import djcelery
djcelery.setup_loader()
CELERY_TIMEZONE = 'UTC'
BROKER_URL = 'django://'
...
INSTALLED_APPS = (
...
'djcelery',
'kombu.transport.django',
...
)
(2) 周期任务配置
#addTaskTime是一个周期任务名
from datetime import timedelta
CELERYBEAT_SCHEDULE = {
'addTaskTime-every-120-seconds':{
'task':'DeviceMana.tasks.addTaskTime',
'schedule': timedelta(seconds=120),
'args':()
},
}
CELERY_TIMEZONE = 'UTC'
5:celery 在django中进行注册
(1) 创建project_name/project_name/celery.py,配置celery的信息
from __future__ import absolute_import
import os
from celery import Celery
from django.conf import settings
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'NetDeviceManage.settings')
app = Celery('NetDeviceManage') # project_name
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))
(2)
project_name/project_name/__init__.py
from __future__ import absolute_import
from .celery import app as celery_app
6:周期任务or 定时任务创建
在project_name/app_name下创建tasks.py
from __future__ import absolute_import
from NetDeviceManage.celery import app
from DeviceMana.models import PeriodTask
@app.task
def addTaskTime():
# do something
#
print 'do periodical task!'
7:django中运行
(1)数据库同步:python manage.py makemigrations
python manage.py migrate
(2)Django 运行
(3)celery 运行
python manage.py celery beat
python manage.py celery worker
参考:
https://github.com/celery/django-celery
http://www.ttsgs.com/articles/detail/2015-02-18/435835/%E5%BC%82%E6%AD%A5-django-web%E6%9C%8D%E5%8A%A1%E5%99%A8
http://my.oschina.net/kinegratii/blog/292395
http://celery.readthedocs.org/en/latest/userguide/periodic-tasks.html