社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Django

Win10系统下使用Django2.0.4+Celery4.4.2+Redis来实现异步任务队列以及定时(周期)任务(2020年最新攻略)

刘悦的技术博客 • 5 年前 • 676 次点击  
阅读 13

Win10系统下使用Django2.0.4+Celery4.4.2+Redis来实现异步任务队列以及定时(周期)任务(2020年最新攻略)

原文转载自「刘悦的技术博客」v3u.cn/a_id_153

首先明确一点,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协程库的加持下,更加如虎添翼,准入门槛也比以前低了不少。

原文转载自「刘悦的技术博客」 v3u.cn/a_id_153

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/70150