Win11系统下使用Django+Celery实现异步任务队列以及定时(周期)任务(2020年最新攻略)

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 首先明确一点,celery4.1+的官方文档已经详细说明,该版本之后不需要引入依赖 django-celery 这个库了,直接用 celery 本身就可以了,就在去年年初的一篇文章[python3.7.2+Django2.0.4 使用django-celery遇到的那些坑](https://v3u.cn/a_id_54),中提到的一些bug,在今年早已不复存在,所以技术更新频率越来越快,本文详细阐述用新版Celery(4.4.2)来实现。

首先明确一点,celery4.1+的官方文档已经详细说明,该版本之后不需要引入依赖 django-celery 这个库了,直接用 celery 本身就可以了,就在去年年初的一篇文章python3.7.2+Django2.0.4 使用django-celery遇到的那些坑,中提到的一些bug,在今年早已不复存在,所以技术更新频率越来越快,本文详细阐述用新版Celery(4.4.2)来实现。

关于celery的底层原理这里就不赘述了,简单的流程图就可以一图以蔽之

安装对应的库

pip3 install celery==4.4.2
pip3 install eventlet==0.25.2
pip3 install Django==2.0.4

eventlet是一个高性能协程库,用来解决win10下celery进程的bug

配置settings.py文件:

CELERY_BROKER_URL = 'redis://localhost:6379/'  
  
CELERY_RESULT_BACKEND = 'redis://localhost:6379/'  
  
CELERY_RESULT_SERIALIZER = 'json'

这里broker配置redis,同时backend也就是任务结果也存到redis中,格式为json,方便读写。

在settings.py同级目录创建celery.py

from __future__ import absolute_import, unicode_literals  
import os  
from celery import Celery  
  
# 设置环境变量  
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mydjango.settings')  
  
# 注册Celery的APP  
app = Celery('mydjango')  
# 绑定配置文件  
app.config_from_object('django.conf:settings', namespace='CELERY')  
  
# 自动发现各个app下的tasks.py文件  
app.autodiscover_tasks()

注意mydjango为你当前的django项目名称

修改settings.py同级目录的init.py文件

from __future__ import absolute_import, unicode_literals  
from .celery import app as celery_app  
  
#导包  
import pymysql  
#初始化  
pymysql.install_as_MySQLdb()  
  
  
  
__all__ = ['celery_app']

在应用中创建tasks.py文件

from celery.task import task  
  
# 自定义要执行的task任务  
@task  
def print_test():  
    print("nict try")  
    return 'hello'

如果需要,也可以在settings.py里将该任务配置为定时任务(周期任务)

from celery.schedules import crontab  
CELERY_BEAT_SCHEDULE = {  
    # 周期性任务  
    'task-one': {  
        'task': 'myapp.tasks.print_test',  
        'schedule': 5.0, # 每5秒执行一次  
        # 'args': ()  
    }  
}

同时异步任务也可以通过django的视图进行在线调用

from myapp import tasks  
  
def ctest(request,*args,**kwargs):  
    res=tasks.print_test.delay()  
    #任务逻辑  
    return JsonResponse({'status':'successful','task_id':res.task_id})

这里的delay方法就是异步方式请求,而非django默认的同步执行步骤

在manage.py的目录下启动celery服务

celery worker -A mydjango -l info -P eventlet

在浏览器中调用异步服务接口

同时也可以在backend中查询任务结果

注意一点,redis中的key并不是单纯的task\_id,而是需要加上前缀celery-task-meta-

最后,如果需要启动定时任务,就需要在manage.py所在的文件夹内单独启动beat服务

celery -A mydjango beat -l info

可以看到任务队列会每隔五秒执行一次定时任务

总体而言,Celery4.4.2解决了很多bug,比如著名的async关键字的问题,同时优化了性能,在eventlet协程库的加持下,更加如虎添翼,准入门槛也比以前低了不少。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
5月前
|
NoSQL 调度 Redis
33 Django高级 - celery
33 Django高级 - celery
26 0
|
11天前
|
开发者 Python
Django模板系统的强大之处:动态渲染与扩展性
【4月更文挑战第15天】Django模板系统是Web开发中的强大工具,支持动态渲染和扩展性。动态渲染包括变量、标签和过滤器的使用,实现内容根据上下文数据动态生成。模板继承和自定义标签则提升了扩展性,减少代码重复,增强可维护性。通过这些特性,Django模板系统助力开发者构建高效、动态的Web应用。
|
9月前
|
SQL 前端开发 JavaScript
基于python+django的外卖点餐网站-外卖点餐系统
该系统是基于python+django开发的外卖点餐系统。适用场景:大学生、课程作业、毕业设计。学习过程中,如遇问题可以在github给作者留言。
137 0
|
6月前
|
调度 数据库 Python
Django实现定时任务
Django实现定时任务
|
7月前
|
前端开发 JavaScript 数据可视化
基于Python+Django实现一个电商购物网站系统
基于Python+Django实现一个电商购物网站系统
267 0
|
8月前
|
计算机视觉 C++ Python
Python+Django人脸识别考勤系统网站
这篇博客针对<<Python+Django人脸识别考勤系统网站>>编写代码,代码整洁,规则,易读。 学习与应用推荐首选。
142 0
|
8月前
|
计算机视觉 C++ Python
Django网页+Yolov5垃圾识别系统
这篇博客针对<<Django网页+Yolov5垃圾识别系统>>编写代码,代码整洁,规则,易读。 学习与应用推荐首选。
226 0
|
9月前
|
Shell 数据库 数据库管理
【Django学习】(一)Django的环境搭建--windows系统
【Django学习】(一)Django的环境搭建--windows系统
|
9月前
|
监控 JavaScript 前端开发
基于django的物流管理系统(二)
基于django的物流管理系统(二)
117 0
|
9月前
|
机器学习/深度学习 编解码 算法
鸟类识别系统python+TensorFlow+Django网页界面+卷积网络算法+深度学习模型
鸟类识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Django框架,开发网页端操作平台,实现用户上传一张图片识别其名称。
200 0
鸟类识别系统python+TensorFlow+Django网页界面+卷积网络算法+深度学习模型