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是以非守护进程的方式启动的,如果关闭当前命令窗口就停止服务了,所以在程序运行期间请不要关闭窗口。 - 修改配置文件
- 修改Django项目的settings文件,注册使用celery
在settings文件最后添加如下代码:
- 修改Django项目的settings文件,注册使用celery
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号执行一次