首页 > 数据库 >django + redis + celery 异步任务

django + redis + celery 异步任务

时间:2024-10-04 20:00:38浏览次数:9  
标签:tasks app py redis django celery import

目录结构

E:.
│  db.sqlite3
│  Dockerfile
│  manage.py
│  requirements.txt
│
├─celery_tasks  # 自定义一个celery的工作目录
│  │  config.py  # celery配置文件
│  │  __init__.py
│  │
│  ├─sms
│      tasks.py   #  worker任务
│      __init__.py
│    
│
├─dashboard
│  │  asgi.py
│  │  celery.py  # 同settings.py目录下 创建该文件
│  │  settings.py
│  │  urls.py
│  │  wsgi.py
│  │  __init__.py  # 修改该文件
│
├─dbcv  # app
  │  admin.py
  │  apps.py
  │  models.py
  │  serializers.py
  │  test.py
  │  tests.py
  │  views.py
  │  __init__.py
......

celery

1、创建celery工作目录
在项目根目录下创建 celery_tasks

2、创建config.py配置文件

# 配置异步任务

# 设置结果存储
result_backend = 'redis://127.0.0.1:6379/1'

# 设置代理人broker
broker_url = 'redis://127.0.0.1:6379/2'

# celery 的启动工作数量设置
CELERY_WORKER_CONCURRENCY = 20
# 任务预取功能,就是每个工作的进程/线程在获取任务的时候,会尽量多拿 n 个,以保证获取的通讯成本可以压缩。
WORKER_PREFETCH_MULTIPLIER = 20
# 非常重要,有些情况下可以防止死锁
CELERYD_FORCE_EXECV = True
# celery 的 worker 执行多少个任务后进行重启操作
CELERY_WORKER_MAX_TASKS_PER_CHILD = 100
# 禁用所有速度限制,如果网络资源有限,不建议开足马力。
WORKER_DISABLE_RATE_LIMITS = True
# 明确指示在启动时进行连接重试
# BROKER_CONNECTION_RETRY_ON_STARTUP = True
broker_connection_retry_on_startup = True

# 2、配置定时任务
timezone = 'Asia/Shanghai'
DJANGO_CELERY_BEAT_TZ_AWARE = False
CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers:DatabaseScheduler'
``

2、创建celery.py

同settings.py目录下 创建该文件

import os

from django.utils import timezone
from celery import Celery

from celery.schedules import crontab, timedelta

from celery_tasks import config

设置环境变量, 导入django配置; 后续便于使用django组件功能

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'dashboard.settings')

app = Celery("apps")

读取配置文件中的配置

app.config_from_object(config)

自动从django注册的app中发现所有任务

app.autodiscover_tasks()

解决时区问题,定时任务启动就循环输出

app.now = timezone.now

celery -A dashboard worker -l info -P eventlet


3、创建个wocker文件:tasks.py

常见的如发送邮件、短信等等

tasks.py

import time
from dashboard.celery import app

通过 @app.task 装饰器,定义celery的wocker函数对象

@app.task
def send_sms(desc=None):
print("send_sms start")
if desc:
print(desc)
time.sleep(20)
print("send_sms end")
return "send_sms ok"



4、在app视图中调用

@api_view(['GET'])
def test(request):
"""
测试token
"""
current_time = timezone.now()
print("当前时间是:{}".format(current_time))

# .delay() 方法调用
result = tasks.send_sms.delay("视图调用celery任务")

res_data = {'data': {'status_code': 200}}
return Response(**res_data)

5、运行celery
打开终端,win+r,cmd

windows下需要加 -P eventlet 运行,否则会报错(celery的问题)

celery -A dashboard worker -l info -P eventlet

Linux下

celery -A dashboard worker -l info


6、运行django

python manage.py runserver


7、通过接口调用接口API,观察celery的运行即可

完成!!!

标签:tasks,app,py,redis,django,celery,import
From: https://www.cnblogs.com/lanjianhua/p/18447192

相关文章

  • 八、Redis key空间通知
    redis的key空间通知是实时监控Redis键和值的更改。那什么是key空间通知呢?当客户端执行一些命令,比如setnameTom,会创建或更新key。此时Redis服务器会将这些事件发布到通道中,客户端可以通过subscribe通道,以便接收以某种方式影响Redis数据集的事件。如果发布/订阅客户端断开连接,然......
  • 基于django+vue+Vue的高校设备信息管理系统的设计与实现【开题报告+程序+论文】-计算
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着高校教育事业的蓬勃发展,各类教学科研设备的数量急剧增加,设备信息管理成为高校管理中的重要环节。传统的人工管理方式不仅效率低下,而且......
  • 基于django+vue+Vue的高校教师多维考核评价系统设计开发与实现【开题报告+程序+论文】
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着高等教育的快速发展,高校教师的工作内容与职责日益复杂多样,传统的单一维度评价体系已难以满足当前对高校教师全面、公正评价的需求。近......
  • 基于django+vue+Vue的房屋租借系统【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着城市化进程的加速和人口流动性的增强,房屋租借市场日益繁荣,成为满足人们居住需求的重要途径。然而,传统的房屋租借方式往往依赖于中介或......
  • 七、Redis之sorted set
    sortedset也是Redis中常用的类型。可以用来解决热搜,排名前十等问题。ZADDZADDkey[NX|XX][GT|LT][CH][INCR]scoremember[scoremember...]zadd将多个分数和元素对添加到sortedset中。还有些选项影响了zadd的行为:XX:仅更新已存在的元素。不要添加新元素。NX:只添加......
  • 【SpringBoot】结合Redis实现缓存
    Redis经常用于缓存。接下来,我们以Springboot框架为例。实现一些Redis的基础操作,创建完SpingBoot项目后,具体步骤如下图:  pom中添加项目依赖<!--Redis缓存--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-re......
  • redis设计统计用户访问量
    需求:实现某个接口每天调用了多少次,每个用户只记录一次。(例如,统计刷题模块,练题模块,模拟面试模块每天访问量,利于后续针对功能访问量做出其他优化设计。贴子的浏览量)先分析几种不同的方案:方案一:使用Hash哈希结构实现方法:当用户访问网站时,我们可以使用用户的ID作为标识(若用户未......
  • 六、redis之set
    Redis集合是成员的无序集合。可以用来保存唯一的成员。注意:对于以下的命令,涉及删除成员的,如果集合中的所有元素都被移除,则集合会被删除。如果集合原先不存在,被当作空集合。SADDSADDkeymember[member...]sadd命令将一系列成员添加到set中。SMEMBERSSMEMBERSkeysmemb......
  • Redis 发布订阅模式
    概述Redis的发布/订阅是一种消息通信模式:发送者(Pub)向频道(Channel)发送消息,订阅者(Sub)接收频道上的消息。Redis客户端可以订阅任意数量的频道,发送者也可以向任意频道发送数据。在发送者向频道发送一条消息后,这条消息就会被发送到订阅该频道的客户端(Sub)Redis有两种发布/订阅模式......
  • Redis: Sentinel工作原理和故障迁移流程
    Sentinel哨兵几个核心概念1)定时任务Sentinel它是如何工作的,是如何感知到其他的Sentinel节点以及Master/Slave节点的就是通过它的一系列定时任务来做到的,它内部有三个定时任务第一个就是每一秒每个Sentinel对其他Sentinel和Redis节点执行PING操作(监......