nonebot2/website/versioned_docs/version-2.1.2/best-practice/scheduler.md
noneflow[bot] 94eecaf448 🔖 Release 2.1.2
2023-10-31 10:05:03 +00:00

3.9 KiB

sidebar_position description
0 定时执行任务

定时任务

APScheduler (Advanced Python Scheduler) 是一个 Python 第三方库,其强大的定时任务功能被广泛应用于各个场景。在 NoneBot 中,定时任务作为一个额外功能,依赖于基于 APScheduler 开发的 nonebot-plugin-apscheduler 插件进行支持。

安装插件

在使用前请先安装 nonebot-plugin-apscheduler 插件至项目环境中,可参考获取商店插件来了解并选择安装插件的方式。如:

项目目录下执行以下命令:

nb plugin install nonebot-plugin-apscheduler

使用插件

nonebot-plugin-apscheduler 本质上是对 APScheduler 进行了封装以适用于 NoneBot 开发,因此其使用方式与 APScheduler 本身并无显著区别。在此我们会简要介绍其调用方法,更多的使用方面的功能请参考APScheduler 官方文档

导入调度器

由于 nonebot_plugin_apscheduler 作为插件,因此需要在使用前对其进行加载导入其中的 scheduler 调度器来创建定时任务。使用 require 方法可轻松完成这一过程,可参考 跨插件访问 一节进行了解。

from nonebot import require

require("nonebot_plugin_apscheduler")

from nonebot_plugin_apscheduler import scheduler

添加定时任务

APScheduler 官方文档 中提供了以下两种直接添加任务的方式:

from nonebot import require

require("nonebot_plugin_apscheduler")

from nonebot_plugin_apscheduler import scheduler

# 基于装饰器的方式
@scheduler.scheduled_job("cron", hour="*/2", id="job_0", args=[1], kwargs={arg2: 2})
async def run_every_2_hour(arg1: int, arg2: int):
    pass

# 基于 add_job 方法的方式
def run_every_day(arg1: int, arg2: int):
    pass

scheduler.add_job(
    run_every_day, "interval", days=1, id="job_1", args=[1], kwargs={arg2: 2}
)

:::caution 注意 由于 APScheduler 的定时任务并不是由事件响应器所触发的事件,因此其任务函数无法同事件处理函数一样通过依赖注入获取上下文信息,也无法通过事件响应器对象的方法进行任何操作,因此我们需要使用调用平台 API的方式来获取信息或收发消息。

相对于事件处理依赖而言,编写定时任务更像是编写普通的函数,需要我们自行获取信息以及发送信息,请不要将事件处理依赖的特殊语法用于定时任务! :::

关于 APScheduler 的更多使用方法,可以参考 APScheduler 官方文档 进行了解。

配置项

apscheduler_autostart

  • 类型: bool
  • 默认值: True

是否自动启动 scheduler ,若不启动需要自行调用 scheduler.start()

apscheduler_log_level

  • 类型: int
  • 默认值: 30

apscheduler 输出的日志等级

  • WARNING = 30 (默认)
  • INFO = 20
  • DEBUG = 10 (只有在开启 nonebot 的 debug 模式才会显示 debug 日志)

apscheduler_config

  • 类型: dict
  • 默认值: { "apscheduler.timezone": "Asia/Shanghai" }

apscheduler 的相关配置。参考配置调度器, 配置参数

配置需要包含 apscheduler. 作为前缀,例如 apscheduler.timezone