Celery从3.1版本以后不需要用单独的库来支持django了,可以像单独使用celery的api那样在django中使用原生celery。软件版本如下
python 3.6.6
Django 2.1.4
celery 4.2.1
redis 4.0.10
我参考了celery的官方文档,因为使用了python3,所以删减了一些满足python2兼容性的代码。
- proj/
- manage.py
- proj/
- __init__.py
- settings.py
- urls.py
- app/
- admin.py
- models.py
- setting.py
- urls.py
- views.py
proj/proj/celery.py
模块定义celery实例import os
from celery import Celery
# 把置默认的django settings模块配置给celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')
app = Celery('proj')
# 这里使用字符串以使celery的worker不用为子进程序列化配置对象。
# 命名空间 namespace='CELERY'定义所有与celery相关的配置的键名要以'CELERY_'为前缀。
app.config_from_object('django.conf:settings', namespace='CELERY')
# 从所有django app configs中加载task模块,
# 如果你把所有的task都定义在单独的tasks.py模块中,
# 加上这句话celery会自动发现这些模块中的task,实际上这句话可以省略。
app.autodiscover_tasks()
proj/proj/__init__.py
导入这个模块,使得django启动时加载celery的appfrom proj.celery import app as celery_app
__all__ = ('celery_app',)
porj/settings
中配置celery# Celery application definition
CELERY_BROKER_URL = 'redis://localhost:6379'
CELERY_RESULT_BACKEND = 'redis://localhost:6379'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TASK_SERIALIZER = 'json'
celery -A proj worker -l info
# 导入celery_app
from proj import celery_app
# 在异步执行的函数上加task装饰器
@celery_app.task
def your_function():
pass
# 在视图函数中执行异步方法,
# 注意别忘了通过delay方法来实现异步调用
def index(request):
your_function.delay()
return HttpResponseRedirect('/')
@celery_app.task
装饰的方法会注册到celery