当前位置: 首页 > news >正文

django_rq

使用 Loguru 记录 Django-RQ 任务日志

要在 Django-RQ 处理的任务中使用 Loguru 记录日志,你需要做的就是按照标准的 Loguru 使用方法配置和使用日志记录器。下面是一个简单的示例,展示如何在 Django-RQ 的任务中集成 Loguru

安装必要的包

首先,确保你已经安装了 django-rq, rq, 和 loguru:

bash

深色版本

pip install django-rq rq loguru
在任务中使用 Loguru

接下来,创建或修改你的任务文件(例如 tasks.py),并在其中使用 Loguru 来记录日志:

python

深色版本

from loguru import logger
from rq.decorators import job
from django.conf import settings# 如果需要,可以在这里添加更多的 Loguru 配置,比如设置日志文件等
logger.add(settings.BASE_DIR + "/debug.log", format="{time} {level} {message}", level="DEBUG")@job('default', connection_name='default')
def example_task(x, y):logger.info(f"Starting task with parameters: x={x}, y={y}")# 模拟一些处理逻辑result = x + ylogger.debug(f"Task completed with result: {result}")return result

在这个例子中,我们首先导入了 Logurulogger,然后设置了日志输出到一个文件中,并设置了日志级别为 DEBUG。之后定义了一个名为 example_task 的任务函数,在这个函数内部使用 logger 记录信息和调试日志。

配置 Django-RQ

确保你在 settings.py 中正确配置了 Django-RQ,包括 Redis 服务器的地址等信息。并且,确保你的任务被正确的队列化并提交给 RQ 处理。

运行 Worker

为了使任务得以执行,你需要启动一个 RQ worker。可以通过以下命令运行:

bash

深色版本

python manage.py rqworker default

这里的 default 是队列的名字,与我们在 @job 装饰器中指定的一致。

通过这种方式,你可以轻松地在 Django-RQ 的任务中使用 Loguru 进行日志记录,方便调试和监控后台任务的执行情况。记得根据实际需求调整日志的格式、存储位置以及日志级别等配置。

============================ 

django_rq 中实现定时任务,通常会使用 RQ Scheduler 这个扩展库。RQ Scheduler 允许你根据时间计划执行任务,比如延迟执行任务、周期性执行任务等。下面是具体步骤来设置和使用定时任务。

安装依赖

首先,确保你已经安装了 django-rqrq-scheduler。如果还没有安装,可以通过 pip 来安装它们:

bash

深色版本

pip install django-rq rq-scheduler

配置 Django 项目

  1. 添加到 INSTALLED_APPS: 在你的 settings.py 文件中,添加 'django_rq'INSTALLED_APPS 列表中(如果你还没添加的话)。

    python

    深色版本

    INSTALLED_APPS = [# 其他应用'django_rq',
    ]
  2. 配置 RQ 队列: 确保你在 settings.py 中定义了 RQ_QUEUES,并且至少有一个队列被定义。例如:

    python

    深色版本

    RQ_QUEUES = {'default': {'HOST': 'localhost','PORT': 6379,'DB': 0,'PASSWORD': '','DEFAULT_TIMEOUT': 360,},
    }

创建定时任务

  1. 创建任务函数: 在你的应用目录下创建一个 tasks.py 文件,并定义一些任务函数。例如:

    python

    深色版本

    # myapp/tasks.py
    from datetime import datetimedef scheduled_task():print(f"定时任务执行于 {datetime.now()}")
  2. 调度定时任务: 使用 rq-scheduler 提供的功能来调度这些任务。可以在你的管理命令或者视图中进行调度,但更常见的是通过管理命令或单独的脚本来启动调度器。

     

    下面是一个简单的例子,展示如何在管理命令中调度一个每分钟执行一次的任务:

    python

    深色版本

    # myapp/management/commands/start_scheduler.py
    from django.core.management.base import BaseCommand
    from rq_scheduler import Scheduler
    from redis import Redis
    from myapp.tasks import scheduled_task
    from datetime import timedeltaclass Command(BaseCommand):help = '启动调度器'def handle(self, *args, **kwargs):scheduler = Scheduler('default', connection=Redis())  # 使用默认队列# 每隔1分钟执行一次scheduled_taskscheduler.schedule(scheduled_time=datetime.utcnow(),  # 第一次执行的时间func=scheduled_task,interval=60,  # 间隔时间,单位为秒repeat=None  # 如果不是无限重复,则指定重复次数)print("调度器已启动")

启动 Worker 和 Scheduler

  1. 运行 worker: 首先需要运行一个 RQ worker 来处理任务队列。

    bash

    深色版本

    python manage.py rqworker default
  2. 运行 scheduler: 然后,你需要运行 RQ 调度器来触发定时任务。

    bash

    深色版本

    python manage.py rqscheduler --interval 60

    这里的 --interval 60 参数表示调度器每60秒检查一次是否有待执行的任务。你可以根据需要调整这个值。

通过上述步骤,你就能够在 Django 项目中使用 django_rqrq-scheduler 实现定时任务。这样可以帮助你自动化各种后台操作,如定期清理数据、发送通知等。

SCHEDULER_JOBSdjango-rq-scheduler 中的一个配置项,它允许你在 Django 的设置文件中直接定义需要定时执行的任务。通过这种方式,你可以更方便地管理和配置定时任务,而无需在代码逻辑中硬编码任务调度的细节。

配置 SCHEDULER_JOBS

要在你的 Django 项目中使用 SCHEDULER_JOBS,你需要确保已经安装了 django-rqdjango-rq-scheduler。如果还没有安装,可以通过 pip 安装:

bash

深色版本

pip install django-rq rq-scheduler django-rq-scheduler

接下来,在你的 settings.py 文件中添加和配置 django_rq 及其调度器相关的设置。

示例配置

以下是一个如何在 settings.py 中配置 SCHEDULER_JOBS 的示例:

python

深色版本

# settings.pyINSTALLED_APPS = [# 其他应用'django_rq','django_rq_scheduler',  # 确保已添加到INSTALLED_APPS中
]RQ_QUEUES = {'default': {'HOST': 'localhost','PORT': 6379,'DB': 0,'PASSWORD': '','DEFAULT_TIMEOUT': 360,},
}# 配置定时任务
SCHEDULER_JOBS = [{'func': 'myapp.tasks.scheduled_task',  # 任务函数路径'interval': 60,  # 每隔60秒执行一次'repeat': None,  # 无限重复},{'func': 'myapp.tasks.another_scheduled_task','cron_string': '0 0 * * *',  # 使用cron表达式每天午夜执行'repeat': None,},
]

在这个例子中,我们定义了两个定时任务:

  1. 第一个任务每60秒执行一次,且无限重复。
  2. 第二个任务使用 cron 表达式 '0 0 * * *' 每天午夜执行一次。

注意事项

  • 任务函数: 在 SCHEDULER_JOBS 中指定的任务函数应是可导入的,并且应当接受任意关键字参数(**kwargs),因为调度器可能会传递额外的参数给这些函数。

  • 运行调度器: 为了使这些定时任务生效,你需要运行 RQ 调度器。这可以通过以下命令完成:

    bash

    深色版本

    python manage.py rqscheduler --interval 60

    这里的 --interval 60 参数表示调度器每隔60秒检查一次是否有待执行的任务。你可以根据需要调整这个值。

通过在 settings.py 中配置 SCHEDULER_JOBS,你可以更加灵活和方便地管理项目的定时任务,使得任务的调度和维护变得更加直观和易于操作。


✅ 为什么必须运行 rqworker

🧠 简单理解原理

在 Django + RQ 的体系中,各个组件的职责如下:

组件职责
Redis消息中间件,保存任务队列
RQ Scheduler (rqscheduler)安排定时任务,将任务按计划放入 Redis 队列
RQ Worker (rqworker)从 Redis 中取出任务并实际执行

所以:

  • SCHEDULER_JOBS 和 rqscheduler:只是负责“安排”任务何时进入队列。
  • rqworker:才是真正“执行”任务的人。

如果你不运行 rqworker,虽然调度器会把任务加入队列,但这些任务永远不会被消费和执行!


✅ 正确使用流程(包含定时任务)

你需要同时运行以下两个服务:

1. 启动 worker(处理任务)

bash

深色版本

python manage.py rqworker default

或者有多个队列时:

bash

深色版本

python manage.py rqworker default high low

2. 启动 scheduler(安排定时任务)

bash

深色版本

python manage.py rqscheduler --interval 1
  • --interval 1 表示每秒钟检查一次是否有到期的任务要触发(你可以根据需求调整间隔)。

✅ 示例验证任务是否执行成功

tasks.py

python

深色版本

# myapp/tasks.py
import logginglogger = logging.getLogger(__name__)def scheduled_task():logger.info("定时任务已执行!")print("✅ 定时任务执行成功!")

settings.py

python

深色版本

SCHEDULER_JOBS = [{'func': 'myapp.tasks.scheduled_task','interval': 10,  # 每隔10秒执行一次'repeat': None,}
]

运行命令

终端1:启动 worker

bash

深色版本

python manage.py rqworker default

终端2:启动调度器

bash

深色版本

python manage.py rqscheduler --interval 1

你应该会在 worker 的输出中看到每隔 10 秒打印出:

深色版本

✅ 定时任务执行成功!

✅ 总结

功能是否需要运行命令命令
启动定时任务调度器python manage.py rqscheduler
执行任务(包括定时任务)python manage.py rqworker [queue_name]
只定义 SCHEDULER_JOBS❌ 不够必须配合 worker + scheduler 才能生效

 这里有个很大的问题,就是包版本的问题:

pip install rq==1.16.2
pip install django-rq==2.5.1
pip install django-rq-scheduler==2023.9.0
pip install rq-scheduler==0.10.0

这个版本是可用的


http://www.mrgr.cn/news/100819.html

相关文章:

  • 用TCP实现服务器与客户端的交互
  • 新闻客户端案例的实现,使用axios获取数据并渲染页面,路由传参(查询参数,动态路由),使用keep-alive实现组件缓存
  • MySQL基础关键_002_DQL(一)
  • string类(详解)
  • ESP32开发-作为TCP服务端接收数据
  • 分组密码算法ShengLooog设计原理详解
  • conda管理python环境
  • ZYNQ笔记(十四):基于 BRAM 的 PS、PL 数据交互
  • 快速搭建对象存储服务 - Minio,并解决临时地址暴露ip、短链接请求改变浏览器地址等问题
  • 希尔伯特第十问题:是一个伪命题
  • 服务容错治理框架resilience4jsentinel基础应用---微服务的限流/熔断/降级解决方案
  • C++入门小馆: 模板
  • 【数学建模国奖速成系列】优秀论文绘图复现代码(二)
  • 1295.统计位数为偶数的数字
  • 数据结构篇:线性表的另一表达—链表之单链表(下篇)
  • [CPCTF 2025] Crypto
  • Python os.path.join()路径拼接异常
  • X²+1素数问题
  • 4:机器人目标识别无序抓取程序二次开发
  • 【中间件】bthread效率为什么高?