Skip to content
On this page

定时任务

AmiyaBot 提供了全局定时任务管理器,基于 apscheduler

⚠️注意⚠️不兼容的更新

在版本 1.6.9 开始,不再支持全局定义定时任务,以及移除了 custom 参数,使用更泛用的 apscheduler trigger 控制任务执行时机。

此方法已不再支持,全局变量 tasks_control 已删除。

python
from amiyabot import AmiyaBot, tasks_control

@tasks_control.timed_task(each=120)
async def _():
    ...

bot.timed_task 装饰器的 custom 参数已删除。

参数名类型释义默认值
eachint循环执行间隔时间,单位(秒)
customCallable自定义循环规则
sub_tagstr子标签default_tag

简单使用

python
from amiyabot import AmiyaBot
from amiyabot.factory import BotHandlerFactory

bot = AmiyaBot(...)  # 或 MultipleAccounts / PluginInstance 对象

# 每 60 秒执行一次任务
@bot.timed_task(each=60)
async def _(instance: BotHandlerFactory):
    ...

插件开发

如果你正在开发插件,并且你不希望在插件的卸载方法里手动取消定时任务,请务必通过 PluginInstance.timed_task 定义任务。

通过 PluginInstance.timed_task 定义的任务可以在插件被卸载时自动取消。

python
from amiyabot import PluginInstance
from amiyabot.factory import BotHandlerFactory

bot = PluginInstance(...)

@bot.timed_task(each=60)
async def _(instance: BotHandlerFactory):
    ...

插件开发详情请查看 插件开发文档

timed_task 装饰器

参数名类型释义默认值
eachint循环执行间隔时间,单位(秒),如果使用其他触发方式,请使用 kwargs 形式的 scheduler.add_job 参数None
sub_tagstr子标签default_tag
run_when_addedbool添加时立即执行一次任务default_tag
**kwargsscheduler.add_job 参数

注意

使用 kwargs 自定义定时任务时,不可使用参数 func 以及 id

自定义执行时机

使用 scheduler.add_job 参数定义任务,可以使任务的执行时机更加灵活。

python
from amiyabot import PluginInstance
from amiyabot.factory import BotHandlerFactory
from apscheduler.triggers.cron import CronTrigger

bot = PluginInstance(...)

# 每个小时中的 5 分 30 秒时执行
@bot.timed_task(trigger='cron', minute=5, second=30)
async def _(instance: BotHandlerFactory):
    ...

# 每分钟的第 20 秒和 40 秒时执行
@bot.timed_task(trigger=CronTrigger('20,40'))
async def _(instance: BotHandlerFactory):
    ...

取消定时任务

为需要取消的定时任务传入 sub_tag 参数,可以重复,重复的 sub_tag 会被整合为一组。

bot.remove_timed_task()

按标签名取消定时任务

参数名类型释义默认值
sub_tagstr需要取消的定时任务的子标签名

示例:执行一次后取消任务

python
from amiyabot import PluginInstance
from amiyabot.factory import BotHandlerFactory

bot = PluginInstance(...)

@bot.timed_task(each=60, sub_tag='test')
async def _(instance: BotHandlerFactory):
    ...
    bot.remove_timed_task('test')