Django+celery 实现异步任务和定时任务

本贴最后更新于 1024 天前,其中的信息可能已经时移俗易

前言

上一篇文章给大家介绍了celery的基本使用,接下来给大家介绍一下在Django中如何使用celery来实现有任务和定时任务。

一、Django+celery实现异步任务

1、项目结构介绍

创建django项目celeryApp

项目中创建应用App01

├─App01
│  ├─admin.py
│  ├─view.py
│  ├─models.py
│  ├─apps.py
│  └─tasks.py
├─celeryApp
│  ├─__init__.py
│  ├─uwsgi.py
│  ├─urls.py
│  ├─settings.py
│  └─celery.py
├─manage.py

  • 项目setting.py同级的目录创建下celery.py
  • 应用目录中创建一个任务的模块tasks.py

2、编写celery.py

import os
from celery import Celery

# 创建celery实例对象
app = Celery("musen",
          broker='redis://redis服务host地址:6379/1',
          backend='redis://redis服务host地址:6379/2')

# 把celery和django进行组合,识别和加载django的配置文件
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'celeryPros.settings.dev')

# 加载任务
# 参数必须必须是一个列表,列表里面上有异步任务的应用名称,celery会自动加载应用目录中的`tasks.py`的任务函数
# app.autodiscover_tasks(["应用1","应用1"])
app.autodiscover_tasks(["celeryApp"])
3、编写任务函数tasks.py
from celeryApp.celery import app
import time

import logging
log = logging.getLogger("django")

@app.task  
def send_sms(mobile):
	"""发送短信的异步任务"""
 print("小柠檬向手机号{}发送短信成功!".format(mobile))
 time.sleep(2)
 return "发送短信完成 OK"

4、启动celery

# 启动Celery的命令
celery -A celeryApp worker --loglevel=info -P threads

5、django视图函数中调用celery定义的异步任务

from django.shortcuts import HttpResponse
from datetime import datetime
from celeryApp.corn_task.tasks import send_sms

def run_test(request):
	"""执行celery任务的视图"""
 # 提交异步任务
 send_sms.delay('199')

 # 提交定时任务
 t = datetime(2022, 3, 4, 14, 41, 00)
 t = datetime.utcfromtimestamp(t.timestamp())
 send_sms.apply_async(args=["小联盟",], eta=t)

 return HttpResponse('异步任务已执行')

6、配置好路由,启动Django,访问视图对应的路由,就会看到celery执行异步任务。

二、django+celery实现定时任务

如果想要在django中使用定时任务功能同样是靠beat完成任务发送功能,当在Django中使用定时任务时,需要安装django-celery-beat插件。以下将介绍使用过程。

1、环境安装

pip install Django-celery-beat

2、任务编写和配置

1、注册django_celery_beat

在settings.py的INSTALLED_APPS中注册django_celery_beat

INSTALLED_APPS = [
  ...
   'django_celery_beat'

]
2、重新生成迁移

执行python manage.py migrate生成迁移

3、setting.py编写celery配置项
# =========celery的配置============
CELERY_TIMEZONE = 'Asia/Shanghai'
CELERY_TASK_TRACK_STARTED = True
CELERY_TASK_TIME_LIMIT = 30 * 60
# 任务队列配置
CELERY_BROKER_URL = 'redis://redis服务host地址:6379/1'
4、编写异步任务
  • 1、项目setting.py同级的目录创建下celery.py,(和前面django+celery实现异步任务一样)

    import os
    from celery import Celery
    
    # 把celery和django进行组合,识别和加载django的配置文件
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'celeryPros.settings.dev')
    # 创建celery实例对象
    app = Celery('CeleryDjango')
    # 加载setting.py中django的配置
    app.config_from_object('django.conf:settings', namespace='CELERY')
    
    # 加载任务
    app.autodiscover_tasks(["App01"])
    
  • 2、应用目录中创建一个任务的模块tasks.py,编写异步任务

    from celeryApp.celery import app
    import time
    
    import logging
    log = logging.getLogger("django")
    
    @app.task  
    def test_run(datas):
    	"""运行测试的定时任务"""
     print("开始执行测试用例,用例数据为{}".format(datas))
     time.sleep(2)
     return "用例执行完成"
    

3、启动celery服务

1、启动celery worker服务

celery -A 项目名 worker --loglevel=info -P threads

2、启动celery beat服务

$ celery -A 项目名 beat -l INFO --scheduler django_celery_beat.schedulers:DatabaseScheduler

4、添加定时任务

1、登录admin后台管理系统

启动django服务,登录amdin后台管理系统,可以看到如下几张表,

1646635865493.png

periodic tasks为定时任务,其他的为定时任务的定时模式,

  • Clocked模式 : 可以设置一个固定的时间来执行任务。
  • Crontabs模式: 可以设置任务在一天中的特定时间或一周中的某一天 的某个时刻周期性执行任务。
  • intervals模式:可以设置任务安装固定的间隔时间来执行。
  • solar events模式:可以设置任务 按照某个经纬度的日出、日落、黎明或黄昏等时间来周期性的执行任务。

创建定时任务时,需选择以上以上四种中的一种,来定时执行任务。

2、创建定时任务

1646637002687.png

1646637149240.png

回帖
请输入回帖内容 ...