django-celery简单使用

By | 2018年11月29日

最近需要在Django的项目中加一个发送邮件的功能,测试时发现发邮件的操作占用时间太长,容易造成客户端假死。因此就考虑将发邮件的操作异步执行,由于是Django项目,同时以前听大神推荐过celery,所以就对Django-celery进行了简单测试
使用版本
在安装测试的过程中,老是报各种缺失包的错误,发现大部分的还是版本不对应造成的,所以最后成功的版本列表如下:

celery==3.1.7
celery-with-redis==3.0
Django==1.9.2
django-celery==3.1.17
安装相关包:
安装过程和我们平常安装包的过程类似:
安装redis:
wget http://download.redis.io/releases/redis-3.2.5.tar.gz
tar xzf redis-3.2.5.tar.gz
cd redis-3.2.5
make
安装其它包:
pip install celery==3.1.7
pip install celery-with-redis==3.0
pip install Django==1.9.2
pip install django-celery=3.1.17
创建Django项目

Django-admin startproject D_C
cd D_C
python manage.py startapp app

配置settings

在INSTALLED_APPS中加入app:

INSTALLED_APPS = (

‘djcelery’,
}

在settings中配置BROKER

import djcelery
djcelery.setup_loader()

BROKER_URL = ‘redis://127.0.0.1:6379/0’
CELERY_IMPORTS = (‘app.task’)

在app文件夹下建立task.py文件新建任务

import time
from celery import task

@task
def add(x, y):
return x + y

@task
def sendmail(mail):
print(‘sending mail to %s…’ % mail[‘to’])
time.sleep(2.0)
print(‘mail sent.’)
return mail[‘to’]

django使用Mysql的时候python migrate 报错Specified key was too long; max key length is 767 bytes

按照上述的包的版本,安装完成之后进行数据库同步,我在本地测试的时候采用的是SQLlite数据库,没有报错,结果在服务器安装的时候报错Specified key was too long; max key length is 767 bytes,各种百度之下,发现这是一个大家都碰到的问题,Django-celery的作者对于这个问题的解决是单独release了一个版本https://github.com/zldevil2011/django-celery,下载这个版本的源码安装之后才可以了,安装流程如下:

wget https://github.com/zldevil2011/django-celery/archive/v3.1.17-mysql-utf8mb4.tar.gz
tar xzvf v3.1.17-mysql-utf8mb4.tar.gz
cd django-celery-3.1.17-mysql-utf8mb4
python setup.py install

然后在同步数据库,就不会发生问题了:

python manage.py makemigrations

python manage.py migrate

或者修改数据库字符编码。

ALTER DATABASE devops CHARACTER SET utf8 COLLATE utf8_general_ci;

启动redis

src/redis-server

启动worker

python manage.py celery worker –loglevel=info

测试
打开python manage.py shell

from app.task import *
tp = add.delay(1,10)
tp.get()
tp2 = sendmail.delay(dict(to=’xx@xx.xx’))
tp2.ready()

如此新建完task之后,在功能函数内部调用function.delay(parameters)即可,此时返回时及时的,但是task处理是异步的

在生产环境中启动worker

nohup python manage. py celery worker —loglevel = info&

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注