坐看云起时|

一枚码农

园龄:7年6个月粉丝:5关注:1

django使用celery

安装包

pip install celery==5.1.2

使用

官方文档:https://docs.celeryq.dev/en/stable/django/first-steps-with-django.html

1.创建django项目,在项目与settings.py同级的的目录下创建celery.py文件,添加以下内容

image

import os
import django
from celery import Celery
from django.conf import settings

# 设置系统环境变量,安装django,必须设置,否则在启动celery时会报错
# dj_celery 是当前项目名
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'dj_celery.settings')
django.setup()

celery_app = Celery('dj_celery')
# 指定配置文件的位置
celery_app.config_from_object('django.conf:settings', namespace='CELERY')
# 自动从settings.INSTALLED_APPS注册的应用中加载tasks.py
celery_app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

2.在项目的__init__.py文件中添加以下内容

image

from .celery import celery_app

__all__ = ['celery_app']

3.在项目的settings.py中添加celery相关的配置(定时任务不需要可以不配置,视情况而定)

image

"""
# celery
# Broker配置,使用Redis作为消息中间件
CELERY_BROKER_URL = 'redis://127.0.0.1:6379/0'

# BACKEND配置,这里使用redis
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/1'

# 结果序列化方案
CELERY_RESULT_SERIALIZER = 'json'

# 任务结果过期时间,秒
CELERY_TASK_RESULT_EXPIRES = 60 * 60 * 24

# 时区配置
CELERY_TIMEZONE = 'Asia/Shanghai'

# 指定导入的任务模块,可以指定多个
# CELERY_IMPORTS = (
#    'mycelery.tasks',
# )

# 添加定时任务
from celery.schedules import crontab
CELERY_BEAT_SCHEDULE = {
    'add_every_1_minute': {
         # 任务路径
        'task': 'mycelery.tasks.add',
         # 每1分钟执行一次
        'schedule': crontab(minute='*/1'),
        'args': (14, 5)
    }
}

4.在app下创建各自的任务文件tasks.py (必须是这个名字,不允许修改)

image

import time

from celery import shared_task, Task


# 任务钩子
class MyHookTask(Task):
    # 成功时执行
    def on_success(self, retval, task_id, args, kwargs):
        print(f'task id:{task_id} , arg:{args} , successful !')

    # 失败时执行
    def on_failure(self, exc, task_id, args, kwargs, einfo):
        print(f'task id:{task_id} , arg:{args} , failed ! erros: {exc}')

    # 任务重试时执行
    def on_retry(self, exc, task_id, args, kwargs, einfo):
        print(f'task id:{task_id} , arg:{args} , retry !  erros: {exc}')


# 在对应的task函数的装饰器中,通过 base=MyHookTask 指定任务钩子
@shared_task(base=MyHookTask)
def add(x, y):
    time.sleep(10)
    print(111111111111111111111111111111111111111111111)
    return x + y


@shared_task
def mul(x, y):
    return x * y


@shared_task(base=MyHookTask)
def xsum(numbers):
    return sum(numbers)

5.至此,celery配置已经完成了,启动celery

在项目根目录下执行命令 启动celery worker 进程,执行broker中的任务:
  -Linux:celery -A dj_celery worker -l info
  -windows: celery -A dj_celery worker -l info -P eventlet  (先要安装 pip install eventlet)
  注:如果启动的时候有冲突,使用命令  celery -A dj_celery worker -l info -P eventlet --pool=solo

image

6.调用任务

from django.shortcuts import render
from django.http.response import HttpResponse
# Create your views here.


from .tasks import *


# Create your views here.

def task_add_view(request):
    add.delay(100, 200)
    return HttpResponse(f'调用函数结果')

image


至此,异步任务已经完成了

7.定时任务启动

因为我们在第3步配置celery的时候已经配置了定时任务,所以现在只需要启动celery beat进程就可以了,关于定时任务的配置可以看第3步

执行命令:
  celery -A dj_celery beat -l info  # 启动celery beat 进程,将定时任务发送到broker
  celery -A dj_celery worker -l info # 启动celery worker 进程,执行broker中的任务
  分别在两个终端中启动,便于观察。

image

image

8.admin后台配置定时任务

a.配置django-celery-beat
1.beat插件安装
    pip3 install django-celery-beat
2.sttings设置
  a.注册app
    INSTALLED_APPS = [
        ....   
        'django_celery_beat',
    ]
  b.时区设置
    CELERY_TIMEZONE = 'Asia/Shanghai'
    DJANGO_CELERY_BEAT_TZ_AWARE = False
    CELERY_ENABLE_UTC = False
3.迁移模型
    python3 manage.py migrate django_celery_beat
4.分别启动woker和beta
    # 启动beta 调度器使用数据库
    celery -A proj beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler
    # 启动woker
    celery worker -A taskproj -l info

时区设置
image

b.登录admin进行管理

image

image

image

image

image

完成啦

参考文档:https://blog.csdn.net/qq_53582111/article/details/120207740
参考文档:https://www.cnblogs.com/huang-yc/p/10110754.html

本文作者:一枚码农

本文链接:https://www.cnblogs.com/yimeimanong/p/16067372.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   一枚码农  阅读(990)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
历史上的今天:
2019-03-28 STM32单片机复位后GPIO电平状态
 
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起
  1. 1 Sold Out Hawk
  2. 2 光辉岁月 Beyond
光辉岁月 - Beyond
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 黄家驹

作曲 : 黄家驹

编曲 : Beyond

制作人 : Beyond/Gordon O'Yang

Synth Programming : Gordon O'Yang / 叶世荣

Mixed by Philip Kwok

钟声响起归家的讯号

钟声响起归家的讯号

在他生命里

仿佛带点唏嘘

黑色肌肤给他的意义

是一生奉献 肤色斗争中

年月把拥有变做失去

疲倦的双眼带着期望

今天只有残留的躯壳

迎接光辉岁月

风雨中抱紧自由

一生经过彷徨的挣扎

自信可改变未来

问谁又能做到

可否不分肤色的界限

可否不分肤色的界限

愿这土地里

不分你我高低

缤纷色彩闪出的美丽

是因它没有

分开每种色彩

年月把拥有变做失去

疲倦的双眼带着期望

今天只有残留的躯壳

迎接光辉岁月

风雨中抱紧自由

一生经过彷徨的挣扎

自信可改变未来

问谁又能做到

今天只有残留的躯壳

今天只有残留的躯壳

迎接光辉岁月

风雨中抱紧自由

一生经过彷徨的挣扎

自信可改变未来

问谁又能做到

Woo

Ah

Ah

今天只有残留的躯壳

今天只有残留的躯壳

迎接光辉岁月

风雨中抱紧自由

一生经过彷徨的挣扎

自信可改变未来

问谁又能做到

Woo

Ah

Ah

今天只有残留的躯壳

今天只有残留的躯壳

迎接光辉岁月

风雨中抱紧自由

一生经过彷徨的挣扎

自信可改变未来