django + redis + celery 异步任务

前言:

  • python version >= 3.6
  • 安装并运行redis
  • 创建好个人的django项目
  • 安装celery
# redis
pip install redis

# 安装celery

pip install celery  # 用本地的python环境进行安装,不要用anaconda的python安装
pip install eventlet  # windows下还需要 安装运行celery的第三方依赖
#帮助文档 多看看 
celery --help 
#常规启动Worker 
celery -A dashboard worker -l info
#Windows下启动Worker 
celery -A dashboard worker -l info -P eventlet
#关闭Worker 退出
Ctrl + C 
 

#启动Beat程序 可以帮我们定时发送任务到消息队列 
celery -A tasks beat --loglevel=INFO 

目录结构

dashboard
│  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
......

django 创建celery + redis异步任务

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

2、创建config.py配置文件
(也可以写直接在django的setting.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、init.py 添加 初始化celery的 app

同settings.py目录下的__init__.py中添加:

from dashboard.celery import app as celery_app

__all__ = ('celery_app',)

4、创建个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"

5、在app视图中调用

@api_view(['GET'])
def test(request):
    """
    测试
    """
    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)

6、在运行celery之前先启动运行redis服务
windows终端 win+r,cmd

redis-server.exe redis.windows.conf

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

# windows下需要加 -P eventlet 运行,否则会报错(celery的问题);dashboard为settings.py的目录名,一般与项目名同名
celery -A dashboard worker -l info -P eventlet

# Linux下
celery -A dashboard worker -l info

8、运行django

python manage.py runserver

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

完成!!!

日常踩坑可参考:吐血总结,避坑指南

posted @   二月雪  阅读(123)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示