0、python 版本 3.7.3
1、安装django, 安装celery, 安装rabbitmq并运行。
1.1、解决因版本冲突导致的worker启动异常(python 3.7)
https://www.jianshu.com/p/5173a79d2d6c
2、pip install django-celery, 版本参考下面
amqp==1.4.9
anyjson==0.3.3
billiard==3.3.0.23
celery==3.1.15
Django==2.2.4
django-celery==3.3.1
dnspython==1.16.0
eventlet==0.25.0
greenlet==0.4.15
importlib-metadata==0.19
kombu==3.0.37
librabbitmq==2.0.0
monotonic==1.5
pytz==2019.2
six==1.12.0
sqlparse==0.3.0
vine==1.3.0
zipp==0.5.2
3、把djcelery加到项目settings.INSTALLED_APPS中,数据迁移python manage.py migrate
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'djcelery',
'demo',
]
4、celery配置(settings)
djcelery.setup_loader()
CELERY_ENABLE_UTC = True
CELERY_TIMEZONE = 'Asia/Shanghai'
BROKER_URL = 'amqp://guest@localhost//'
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
CELERY_RESULT_BACKEND = 'djcelery.backends.database:DatabaseBackend' # 任务元数据保存到数据库中
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TASK_RESULT_EXPIRES = 3600 # celery任务执行结果的超时时间,
CELERYD_CONCURRENCY = 1 if DEBUG else 10 # celery worker的并发数
CELERYD_MAX_TASKS_PER_CHILD = 100 # 每个worker执行了多少任务就会销毁
5、在项目目录下(与settings同级)创建celery.py文件
from __future__ import absolute_import
import os
from celery import Celery
from django.conf import settings
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings') # 项目的settings文件
app = Celery('proj') # 项目名为入参
app.config_from_object('django.conf:settings') # 读取settings中的celery配置
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
6、在app的目录下创建tasks.py
from __future__ import absolute_import
import time
from celery import shared_task
from random import randint
@shared_task
def dosomething():
"""
定义异步任务,返回任务结果
"""
print('task start...')
time.sleep(30)
print('task end...')
return randint(0,10) #
7、定义视图,调用异步任务
from django.http import JsonResponse
from celery.result import AsyncResult
# Create your views here.
from .tasks import dosomething # 引入定义好的异步任务
def test(request):
"""
异步调用任务
:param request:
:return:
"""
result = dosomething.delay() # 调用任务,task_name.delay() 返回值为任务的task_id,可通过此id查任务的进度和结果
return JsonResponse({'msg': 'ok', 'task_id': result.task_id}) # 返回task_id给调用者
def check_result(request, task_id):
"""
通过任务id查询任务结果
:param request:
:param task_id:
:return:
"""
res = AsyncResult(task_id)
if res.ready(): # 检查指定任务是否已经完成
return JsonResponse({'msg': res.result}) # res.result为任务函数的返回值,即任务结果
return JsonResponse({'msg': 'not finish yet...'})
8、路由配置
urlpatterns = [
path('test/', test),
re_path('^check/(?P
.*)/$', check_result), ]
9、启动worker:
进入项目根路径,启动命令:celery -A proj worker -l info
如果celery是4.x版本,在win上运行可能会有问题,此时需要拓展pip install eventlet
命令:celery -A proj worker -l info -P eventlet
启动成功会显示下图
10、启动django应用,通过请求来触发异步任务和查看结果
正常触发任务,并返回task_id
任务接受和完成的打印
查询结果
到此,已基本完成了django和celery结合。
11、如果需要监控任务,可以安装flower,可以监控各个任务的执行情况和worker的状态
pip install flower
另起终端,启动监控
python manage.py celery flower
默认会启动一个监听进程,端口是5555
http://localhost:5555
DEMO链接 django-with-celery.rar
链接:https://pan.baidu.com/s/18et02YyXm9fEX5TPVvyKeg
提取码:lchh
12、定时任务配置
a、先在django后台配置好定时任务
b、启动定时任务监听
celery -A proj beat -l info
监听启动成功后,到达时间就会发送任务