Django 中使用 celery
celery 也提供了基于 Django 项目的整合方案。
下载安装模块
pip install django-celery-results
这个是 Django 整合 celery 的模块,包含了所有需要的大量模块。
配置文件
首先需要配置 settings.py 文件。
# Celery settings
CELERY_BROKER_URL = 'redis://127.0.0.1:6379/5'
#: Only add pickle to this list if your broker is secured
#: from unwanted access (see userguide/security.html) CELERY_ACCEPT_CONTENT = ['json']
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/6'
CELERY_TASK_SERIALIZER = 'json'
INSTALLED_APPS = (
...,
'django_celery_results',
…
)
其实 celery 推荐使用 RabbitMQ,当然其他的消息中间件也行,这里我就使用 redis 了。
配置 celery 的配置文件,在主模块下创建 celery.py(名称位置都不能错):
# celery.py文件
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings')
app = Celery('mysite')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))
在主模块的__init__.py 文件下初始化 celery:
import pymysql pymysql.install_as_MySQLdb()
from .celery import app as celery_app
__all__ = ('celery_app',)
配置异步任务
在需要异步或者定时任务的子模块中创建 tasks.py。
# tasks.py
# Create your tasks here
import time
from __future__ import absolute_import,unicode_literals
from celery
import shared_task,task
import logging
# pip install django-celery-results
# celery -A mysite worker --loglevel=info
# pip install eventlet
# celery -A mysite worker --loglevel=info -P eventlet
# python manage.py migrate django_celery_results
# 定时任务
# https://www.cnblogs.com/dengshihuang/p/8258621.html
@task
def add():
print("开发发送…………")
for i in range(10):
print(i)
print("hhhh")
logging.warning(111111111111)
time.sleep(1)
print("结束发送…………")
启动异步任务
一般异步任务是在视图函数中启动的。如下:
from .tasks import add
def index(request):
# 启动延时任务
add.delay()
ats = models.Article.objects.all().order_by("-publishTime")
return render(request, "index.html", {"articles": ats})
查看是否启动异步任务
在项目的主目录下,执行命令如下,会出现 celery 的异步日志记录,可以查看异步任务执行的情况,如果出现了错误,则执行下面的操作。
celery -A mysite worker --loglevel=info
查看是否启动异步任务,在高版本中启动 celery 的控制台可能出现错误。建议安装如下模块(启动后报错再安装如下模块)。
pip install eventlet
安装后使用这个启动
celery -A mysite worker --loglevel=info -P eventlet
配置定时任务
类似异步操作,装饰器需要修改,注意装饰器的参数问题。
from celery.task.schedules import crontab
from celery.decorators import periodic_task
@periodic_task(run_every=crontab())
def some_task():
print('periodic task test!!!!!')
每分钟 0 秒时刻执行一次,其中,crontab()实例化的时候没设置任何参数,都是使用默认值。
crontab 一共有 7 个参数,常用有 5 个参数分别为:
minute:分钟,范围 0-59;
hour:小时,范围 0-23;
day_of_week:星期几,范围 0-6。以星期天为开始,即 0 为星期天。这个星期几还可以使用英文缩写表示,例如“sun”表示星期天;
day_of_month:每月第几号,范围 1-31;
month_of_year:月份,范围 1-12。
crontab(minute=’’, hour=’’, day_of_week=’’, day_of_month=’’, month_of_year=’’)
crontab(minute=15)# 每小时的 15 分时刻执行一次任务
crontab(minute=0, hour=0)# 每天 0 点 0 分时刻执行任务
crontab(minute=‘0,30’) #可以设置多个值。例如 0 分和 30 分执行一次任务
crontab(minute=’’, hour=‘9-12’)# 指定 9 点到 12 点每个小时的每分钟执行任务
参数如下文档:https://www.cnblogs.com/dengshihuang/p/8258621.html