Django中celery使用简述

celery简介

  • 请各位看官自行百度吧,写着太麻烦了

Django中celery框架

  • 对于web开发,异步处理消息机制可以极大的提升用户体验,但是Django本身不具备异步处理消息的机制,因此Django引入了celery来进行异步任务的处理。

Django中celery的使用

安装celery

  • 因为在这里我选择的使用redis进行消息存储,所以一共需要安装三个包,分别是

    pip install django-celery
    pip install django-redis
    pip install redis==2.10.6
    
  • 这里需要注意的是celey最高支持python3.6版本,如果使用python3.7版本的话在接下来的运行会报错

from kombu.async.timer import to_timestamp
          ^
SyntaxError: invalid syntax

这里的原因是async在python3.7版本中被作为关键字了,所以跟python语法冲突,就会出现提示语法错误。所以想要在python3.7中使用的话需要将kombu包中的async文件夹改名,然后在对应的引用文件中进行修改。具体操作这里就不赘述了。提示一下,通过报错信息定位引用的文件,然后进入进行修改,ok就提示这么多啦。

使用django-celery

  • 首先,需要启动redis服务(ps:redis服务需要自行下载,上面下载的redis并不是redis服务)。在redis安装目录下打开命令窗口,输入如下指令:
    如果出现如下提示就证明redis服务已经成功启动了
    这里需要注意的是,redis是以非守护进程的方式启动的,如果关闭当前命令窗口就停止服务了,所以在程序运行期间请不要关闭窗口。
  • 修改配置文件
    • 修改Django项目的settings文件,注册使用celery
      在这里插入图片描述
      在settings文件最后添加如下代码:
import djcelery
#进行模块载入
djcelery.setup_loader()  
 #因为中间件使用的是redis,所有需要指定redis的服务
BROKER_URL = 'redis://127.0.0.1:6379/1' 
#具体的任务文件,可以根据实际需求进行修改
CELERY_IMPORTS = ('CeleryTask.tasks') 
#celery使用的时区
CELERY_TIMEZONE = 'UTC'  
# django-celery使用的处理器
CELERYBEAT_SCHEDULER= 'djcelery.schedulers.DatabaseScheduler' 
  • 首先在项目的主目录中创建一个celery.py文件,用来编写celery的控制程序
  • 然后,创建名为CeleryTask的子应用(这里的名称跟settings文件中写的保持一致),然后在CeleryTask中创建tasks.py文件用来存放异步任务。
    在这里插入图片描述
  • 编写celery控制文件
import os
from celery import Celery
from django.conf import settings

#设置celery的环境变量和django.celery的主目录
os.environ.setdefault('DJANGO_SETTINGS_MODULE','CeleryTask.settings')
#实例化一个celery应用
app = Celery('art_project')

#加载celery配置
app.config_from_object('django.conf:settings')
#如果在项目当中,创建了task.py,celery就会沿着app去寻找这个文件来生成任务
app.autodiscover_tasks(lambda :settings.INSTALLED_APPS)

  • 编写tasks.py文件
    • 编写第一个 task任务
from __future__ import absolute_import
from Qshop.celery import app

#创建任务
#将普通的函数转换为celery任务
@app.task
def test():
    print('---you are a idiot!!!')
    return 'I am a task of test'
  • 执行数据迁移
    在终端执行python manage.py migrate
  • 启动celery
python manage.py celery worker --loglevel=info
  • 编辑视图,执行任务,这里在views中编写函数调用执行任务
from CeleryTask.tasks import *
def testtask(request):
	#启动异步任务
    test.delay()
    return HttpResponse('hello')
  • 配置对应的路由,调用视图激活任务,具体路由配置跟正常函数视图的调用一样,这样就不赘述了。
  • 执行结果如下:
[2019-10-08 22:27:58,825: INFO/MainProcess] Received task: CeleryTask.tasks.test[aef03a6f-d102-4ba0-b637-be6c14c664fa]
[2019-10-08 22:27:58,835: WARNING/Worker-1] ---you are a idiot!!!
[2019-10-08 22:27:58,899: INFO/MainProcess] Task CeleryTask.tasks.test[aef03a6f-d102-4ba0-b637-be6c14c664fa] succeeded in 0.06300000000192085s:
I am a task of test

简单的调用就到此结束了,接下来简述一下celery定时任务的使用

  • celery 的定时任务使用跟linux的定时任务比较类似,所以平常使用的就较少,各位了解一下就好了。
  • 首先,还是修改settings文件,在settings文件末尾添加关于定时任务的配置与描述,相关代码如下,承接上面的代码:
#导入celery定时任务所需的两个时间包
from celery.schedules import timedelta,crontab
#定时任务的具体描述
CELERYBEAT_SCHEDULE = {
    u'测试任务':{
        'task':'CeleryTask.tasks.test', #定时任务执行的具体函数
        'schedule':timedelta(seconds=1), #定时任务间隔多久执行
        # 'schedule':crontab(minute='*/1'), #定时任务间隔1分钟执行一次

    }
}
  • 重新在虚拟环境中打开一个终端,原来的终端要确保运行,也就是说需要打开两个终端,第一个终端先执行python manage.py celery worker --loglevel=info命令,第二个终端再执行python manage.py celerybeat --loglevel=info命令。
    • 解释一下,第二个命令是启动定时任务的,定时任务的结果将会在第一个终端中进行输出,具体原因这里涉及celery的工作机制,我就不再解释了。
  • 定时任务的频率设置相关写法如下,仅供参考
	crontab(hour="*/2")  每隔两小时执行一次
	crontab(minute = 0,hour="*/2")  每隔两小时的0分执行一次
	crontab(minute = 0,hour="*/2,8-12")   每隔两小时或者是8到12点执行
	crontab(minute = 0,hour=0,day_of_month="2-31/2")   偶数天执行
	crontab(minute = 0,hour=0,day_of_month="1" month_of_year="5")   每年的5月1号执行一次
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值