首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Win10系统下使用Django2.0.4+Celery4.4.2+Redis来实现异步任务队列以及定时(周期)任务(2020年最新攻略)

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

作者头像
用户9127725
发布2022-08-08 10:44:37
发布2022-08-08 10:44:37
5390
举报

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

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

    安装对应的库

代码语言:javascript
复制
pip3 install celery==4.4.2
pip3 install eventlet==0.25.2
pip3 install Django==2.0.4

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

    配置settings.py文件:

代码语言:javascript
复制
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

代码语言:javascript
复制
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文件

代码语言:javascript
复制
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文件

代码语言:javascript
复制
from celery.task import task

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

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

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

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

代码语言:javascript
复制
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服务

代码语言:javascript
复制
celery worker -A mydjango -l info -P eventlet

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

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

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

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

代码语言:javascript
复制
celery -A mydjango beat -l info

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-05-26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档