Django+celery+flower

news2025/5/13 17:46:09

Django+celery+flower

  • Django的定时任务及可视化监控
    • Django

Django的定时任务及可视化监控

Django的定时任务,以及可视化监控。

Django

  1. Django;
    首先在python中新建虚拟环境并激活
pip install virtualenv
python -m venv venv
source venv/bin/activate
pip install django #安装django
安装
  1. 创建django项目;
django-admin startproject myproject
cd myproject

启动Django开发服务器:

python manage.py runserver

默认情况下,服务器会运行在 http://127.0.0.1:8000/。

完成后,可以停用虚拟环境:

deactivate
  1. redis;
    这里使用源码安装,参考redis官网
    新开一个窗口,不在python虚拟环境操作
wget https://download.redis.io/redis-stable.tar.gz
tar -xzvf redis-stable.tar.gz
cd redis-stable
make
sudo yum install openssl-devel
make BUILD_TLS=yes
sudo make install
cp redis.conf  /etc/
redis-server /etc/redis.conf

检查redis是否启动

redis-cli
127.0.0.1:6379> ping
PONG  #成功
  1. celery简单示例;
    安装
pip install  celery django-celery-beat 

新建一个应用

python manage.py startapp myapp

将 myapp 和 django_celery_beat 添加到 INSTALLED_APPS 中,编辑 myproject/settings.py 文件:

INSTALLED_APPS = [
    ...
    'django_celery_beat',
    'myapp',
]

在 myproject 文件夹下创建一个名为 celery.py 的文件,并添加以下内容:

import os
from celery import Celery

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
app = Celery('myproject')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()

在 myproject/init.py 文件中添加以下内容:

from .celery import app as celery_app

__all__ = ('celery_app',)

在 myproject/settings.py 文件中添加 Celery 配置:

CELERY_BROKER_URL = 'redis://localhost:6379/0'
CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
CELERY_TIMEZONE = "Asia/Shanghai"
CELERY_ENABLE_UTC = False

在 myapp 文件夹下创建一个名为 tasks.py 的文件,并定义一个简单的定时任务:

from celery import shared_task
import datetime

@shared_task
def print_time():
    now = datetime.datetime.now()
    print(f"Current time: {now}")

在 myproject/celery.py 文件中定义定时任务的调度计划:

from celery.schedules import crontab

app.conf.beat_schedule = {
    'print-time-every-minute': {
        'task': 'myapp.tasks.print_time',
        'schedule': crontab(minute='*'),
    },
}

这里定义了一个名为 print-time-every-minute 的定时任务,它会每分钟执行一次 myapp.tasks.print_time 任务。
启动 Celery worker:

celery -A myproject worker -l info

启动 Celery beat:

celery -A myproject beat -l info

启动 Django 开发服务器:

python manage.py runserver

查看结果
在终端中可以看到 Celery beat 每分钟调度一次 print_time 任务,并在 Celery worker 的终端中打印当前时间。

  1. 定时任务时间写法;
    在 Celery 中,定时任务的定时时间可以通过多种方式指定,主要包括以下几种常见的写法
    1)使用 crontab,例如每分钟、每小时、每天、每周等
from celery.schedules import crontab

app.conf.beat_schedule = {
    'print-time-every-minute': {
        'task': 'myapp.tasks.print_time',
        'schedule': crontab(minute='*'),  # 每分钟执行一次
    },
    'print-time-every-hour': {
        'task': 'myapp.tasks.print_time',
        'schedule': crontab(minute=0, hour='*'),  # 每小时的第0分钟执行一次
    },
    'print-time-every-day': {
        'task': 'myapp.tasks.print_time',
        'schedule': crontab(minute=0, hour=0),  # 每天的凌晨0点执行一次
    },
    'print-time-every-week': {
        'task': 'myapp.tasks.print_time',
        'schedule': crontab(minute=0, hour=0, day_of_week=1),  # 每周一凌晨0点执行一次
    },
}

参数说明:
minute:分钟,范围是 0-59。
hour:小时,范围是 0-23。
day_of_week:星期几,范围是 0-6,其中 0 表示星期天。
2)使用 timedelta,指定任务的执行间隔,例如每几秒、几分钟、几小时等。

from datetime import timedelta

app.conf.beat_schedule = {
    'print-time-every-10-seconds': {
        'task': 'myapp.tasks.print_time',
        'schedule': timedelta(seconds=10),  # 每10秒执行一次
    },
    'print-time-every-15-minutes': {
        'task': 'myapp.tasks.print_time',
        'schedule': timedelta(minutes=15),  # 每15分钟执行一次
    },
    'print-time-every-2-hours': {
        'task': 'myapp.tasks.print_time',
        'schedule': timedelta(hours=2),  # 每2小时执行一次
    },
}

3)timedelta 的固定时间间隔,需要任务在固定的时间间隔内执行,可以使用 timedelta 的组合

from datetime import timedelta

app.conf.beat_schedule = {
    'print-time-every-1-hour-30-minutes': {
        'task': 'myapp.tasks.print_time',
        'schedule': timedelta(hours=1, minutes=30),  # 每1小时30分钟执行一次
    },
    'print-time-every-2-days-12-hours': {
        'task': 'myapp.tasks.print_time',
        'schedule': timedelta(days=2, hours=12),  # 每2天12小时执行一次
    },
}

4)crontab 的高级组合,支持更复杂的组合,例如指定特定的分钟、小时、星期几等

from celery.schedules import crontab

app.conf.beat_schedule = {
    'print-time-specific-time': {
        'task': 'myapp.tasks.print_time',
        'schedule': crontab(minute=30, hour=14, day_of_week='mon,tue,wed'),  # 每周一、二、三的下午2点30分执行一次
    },
    'print-time-specific-dates': {
        'task': 'myapp.tasks.print_time',
        'schedule': crontab(minute=0, hour=0, day_of_month='1,15'),  # 每月的1号和15号凌晨0点执行一次
    },
}

参数说明:
minute:可以指定具体的分钟,例如 30 或 0,15,30,45。
hour:可以指定具体的小时,例如 14 或 0-23。
day_of_week:可以指定具体的星期几,例如 mon,tue,wed 或 1-5。
day_of_month:可以指定具体的日期,例如 1,15。
5)crontab 的通配符指定更灵活的时间。

from celery.schedules import crontab

app.conf.beat_schedule = {
    'print-time-every-other-minute': {
        'task': 'myapp.tasks.print_time',
        'schedule': crontab(minute='*/2'),  # 每隔2分钟执行一次
    },
    'print-time-every-other-hour': {
        'task': 'myapp.tasks.print_time',
        'schedule': crontab(minute=0, hour='*/2'),  # 每隔2小时执行一次
    },
    'print-time-every-weekday': {
        'task': 'myapp.tasks.print_time',
        'schedule': crontab(minute=0, hour=0, day_of_week='1-5'),  # 每个工作日的凌晨0点执行一次
    },
}

参数说明:
minute=‘/2’:每隔2分钟执行一次。
hour='
/2’:每隔2小时执行一次。
day_of_week=‘1-5’:表示星期一到星期五。
6)timedelta 的动态间隔,动态调整任务的执行间隔,可以在任务中动态修改 beat_schedule

from datetime import timedelta
from celery import shared_task

@shared_task
def dynamic_task():
    print("Dynamic task executed")
    # 修改任务的执行间隔
    app.conf.beat_schedule['dynamic-task']['schedule'] = timedelta(seconds=30)

app.conf.beat_schedule = {
    'dynamic-task': {
        'task': 'myapp.tasks.dynamic_task',
        'schedule': timedelta(seconds=10),  # 初始间隔为10秒
    },
}
  1. flower;
    安装flower
pip install flower

启动,启动之前确保celery已经配置好并运行正常

celery -A myproject flower --port=5555 --broker=redis://localhost:6379/0
加密启动
celery -A myproject flower --port=5555 --broker=redis://localhost:6379/0 --basic_auth=user:password

配置celery,在 Celery 配置中启用事件发送功能,在 myproject/celery.py 文件中添加以下配置:

app.conf.update(
    worker_send_task_events=True,  # 启用任务事件发送
    task_send_sent_event=True,    # 启用任务发送事件
)

在浏览器中访问 http://127.0.0.1:5555/,即可看到 Flower 的监控界面

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2318848.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MapReduce处理数据流程

(一)Shuffle MapReduce中的Shuffle过程指的是在Map方法执行后、Reduce方法执行前对数据进行分区排序的阶段 (二)处理流程 1. 首先MapReduce会将处理的数据集划分成多个split,split划分是逻辑上进行划分,…

基于springboot的教务系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 这些年随着Internet的迅速发展,我们国家和世界都已经进入了互联网大数据时代,计算机网络已经成为了整个社会以及经济发展的巨大动能,各个高校的教务工作成为了学校管理事务的重要目标和任务,因此运用互联网技术来提高教务的…

潮流霓虹酸性渐变液体流体扭曲颗粒边缘模糊JPG背景图片设计素材 Organic Textures Gradients Collection

这个系列将液体运动、霓虹灯和热浪扭曲提炼成一组有机纹理。渐变像水面上的油一样荡漾,模糊了科幻小说与自然之间的界限。这种未来主义的边缘,加上近乎生物的感觉,与正在进行的抽象数字超现实主义浪潮完美同步。 这套具有 20 种原始纹理和 20…

现代时尚标签海报包装网站设计几何风PSAI无衬线英文字体安装包 Matahari Sans Font Family

Matahari(英语:Sun)是生命的动力源泉。与日常生活的其他部分协同作用的力量和能量的象征。这是我们人类需要的最基本的东西之一,就像交流一样。就像 Matahari 本身一样,文字的力量足以维持生计。 参考怪诞字体并受到埃…

Spring MVC响应数据

handler方法分析 /*** TODO: 一个controller的方法是控制层的一个处理器,我们称为handler* TODO: handler需要使用RequestMapping/GetMapping系列,声明路径,在HandlerMapping中注册,供DS查找!* TODO: handler作用总结:* 1.接收请求参数(param,json,pathVariable,共享域等…

联想台式电脑启动项没有U盘

开机按F12,进入启动设备菜单,发现这里没有识别到插在主机的U盘? 解决方法 1、选上图的Enter Setup或者开机按F2,进入BIOS设置 选择Startup -> Primary Boot Sequence 2、选中“Excludeed from boot order”中U盘所在的一行 …

基于 Python 爬取 TikTok 搜索数据 Tiktok爬虫(2025.3.17)

1. 前言 在数据分析和网络爬虫的应用场景中,我们经常需要获取社交媒体平台的数据,例如 TikTok。本篇文章介绍如何使用 Python 爬取 TikTok 用户搜索数据,并解析其返回的数据。 结果截图 2. 项目环境准备 在正式运行代码之前,我…

【HarmonyOS Next】鸿蒙中App、HAP、HAR、HSP概念详解

【HarmonyOS Next】鸿蒙中App、HAP、HAR、HSP概念详解 (图1-1) 一、鸿蒙中App、HAP、HAR、HSP是什么? (1)App Pack(Application Package) 是应用发布的形态,上架应用市场是以App Pa…

计算机二级MS之Excel

声明:跟着大猫和小黑学习随便记下一些笔记供大家参考,二级考试之前将持续更新,希望大家二级都能轻轻松松过啦,过了二级的大神也可以在评论区留言给点建议,感谢大家!! 文章目录 考题难点&#x…

Unity导出WebGL,无法加载,data文件无法找到 404(NotFound)

问题:data文件无法找到404Not found 示例是使用IIS托管启动 F12可以看到not found 的报错 解决办法: iis无法识别data文件,在MIME类型中增加data 类型:application/octet-stream 添加之后,会在根目录下生产一个…

洛谷题目: P1225 黑白棋游戏 题解 (本题难)

题目传送门: P1225 黑白棋游戏 - 洛谷 (luogu.com.cn) 前言: 这道题要求我们找出从黑白棋游戏的初始棋盘状态变化到目标棋盘状态的最短着棋序列,也就是要找到最少的交换相邻方格棋子的步数以及每一步具体的交换位置。我们可以使用广度优先…

SpringBoot与Redisson整合,用注解方式解决分布式锁的使用问题

文章引用:https://mp.weixin.qq.com/s/XgdKE2rBKL0-nFk2NJPuyg 一、单个服务 1.代码 该接口的作用是累加一个值,访问一次该值加1 RestController public class LockController {Autowiredprivate StringRedisTemplate stringRedisTemplate;GetMappin…

通过Typora + PicGo + 阿里云对象存储(OSS)实现图床

文章目录 通过Typora PicGo 阿里云对象存储(OSS)实现图床1 准备工作1.1 阿里云对象存储 OSS配置创建oss存储空间bucket获取AccessKey 1.2 PicGo配置1.3 Typora配置 2 使用流程3 常见问题和解决3.1 创建asesskey3.2 You have no right to access this o…

爱普生FC-12M石英晶体谐振器精准时钟源解决方案

在当今数字化时代,电子设备无处不在,从我们日常使用的智能手机、平板电脑,到复杂的工业控制系统、通信基站,每一台设备的稳定运行都离不开精准的时钟信号。而在众多提供时钟信号的元件中,爱普生 FC-12M 石英晶体谐振器…

【css酷炫效果】纯CSS实现手风琴折叠效果

【css酷炫效果】纯CSS实现手风琴折叠效果 缘创作背景html结构css样式完整代码效果图 想直接拿走的老板,链接放在这里:https://download.csdn.net/download/u011561335/90492015 缘 创作随缘,不定时更新。 创作背景 刚看到csdn出活动了&am…

AI辅助的逆向分析

AI大模型结合反编译工具与AI的辅助分析能力,已能实现部分代码逻辑的还原与重构。 1. 技术实现路径 (1)二进制文件预处理与反编译 反编译工具:需先使用IDA Pro、Ghidra等工具将二进制文件转换为低级中间表示(如汇编代…

物理标签与逻辑标签的区别

物理标签和逻辑标签都可以被机器&#xff08;如浏览器、爬虫、屏幕阅读器&#xff09;解析和识别&#xff0c;但它们的 语义信息 对机器的意义不同。以下是详细解释&#xff1a; 1. 物理标签的解析 可以识别&#xff1a;浏览器会正确解析物理标签&#xff08;如 <b>、<…

《Linux 网络架构:基于 TCP 协议的多人聊天系统搭建详解》

一、系统概述 本系统是一个基于 TCP 协议的多人聊天系统&#xff0c;由一个服务器和多个客户端组成。客户端可以连接到服务器&#xff0c;向服务器发送消息&#xff0c;服务器接收到消息后将其转发给其他客户端&#xff0c;实现多人之间的实时聊天。系统使用 C 语言编写&#x…

鸿蒙NEXT项目实战-百得知识库04

代码仓地址&#xff0c;大家记得点个star IbestKnowTeach: 百得知识库基于鸿蒙NEXT稳定版实现的一款企业级开发项目案例。 本案例涉及到多个鸿蒙相关技术知识点&#xff1a; 1、布局 2、配置文件 3、组件的封装和使用 4、路由的使用 5、请求响应拦截器的封装 6、位置服务 7、三…