Python 的 Flask-APScheduler
是一个 Flask 扩展库,它集成了 APScheduler
,一个高级的 Python 定时任务框架。以下是 Flask-APScheduler
的一些主要作用和特点:
Flask-APScheduler
适用于需要在 Flask 应用中实现定时任务的场景,如定期数据更新、定时报告生成等。通过使用 Flask-APScheduler
,开发者可以更加方便地管理和维护应用中的定时任务。
pip install Flask-APScheduler
包 | 包中文名 | 释义 | 跳转 |
---|---|---|---|
Flask-APScheduler==1.13.1 | / | / | |
├── APScheduler [required: >=3.2.0,<4.0.0, installed: 3.10.4] | / | APScheduler是一个Python库,用于在应用程序中添加定时任务和作业调度功能。 | / |
│ ├── pytz [required: Any, installed: 2024.2] | / | pytz是Python的时区处理库,支持现代和历史时区信息,包括夏令时调整。 | / |
│ ├── six [required: >=1.4.0, installed: 1.16.0] | / | python的six库是一个用于处理 Python 2 和 Python 3 兼容性问题的工具库。 | / |
│ └── tzlocal [required: >=2.0,!=3.*, installed: 5.2] | / | tzlocal是一个Python库,用于自动检测并使用本地时区。 | / |
├── Flask==3.0.3 | / | 主包 | / |
│ ├── blinker [required: >=1.6.2, installed: 1.8.2] | / | blinker 是一个小巧的 Python 库,用于实现对象之间的信号传递。 | / |
│ ├── click [required: >=8.1.3, installed: 8.1.7] | / | Click是一个Python库,用于创建命令行界面,支持装饰器语法,易于创建命令行应用程序。 | / |
│ ├── itsdangerous [required: >=2.1.2, installed: 2.2.0] | / | itsdangerous是一个Python库,用于安全地传递信任数据,支持签名和加密,常用于Web应用中的会话管理和数据验证。 | / |
│ ├── Jinja2 [required: >=3.1.2, installed: 3.1.4] | / | Jinja2是一个现代且设计友好的Python模板引擎,广泛用于Web应用开发。 | Flask - 扩展 - jinja2 - 模版处理信息 - {{}} |
│ │ └── MarkupSafe [required: >=2.0, installed: 2.1.5] | / | MarkupSafe 是一个 Python 库,用于安全地处理和转义 HTML 和 XML 标记。 | / |
│ └── Werkzeug [required: >=3.0.0, installed: 3.0.4] | / | Werkzeug是Python的WSGI工具包,用于开发Web应用程序,提供请求、响应对象和中间件。 | / |
│ └── MarkupSafe [required: >=2.1.1, installed: 2.1.5] | / | MarkupSafe 是一个 Python 库,用于安全地处理和转义 HTML 和 XML 标记。 | / |
└── python-dateutil [required: >=2.4.2, installed: 2.9.0.post0] | / | python-dateutil是一个Python库,提供强大的日期和时间处理功能。 | / |
└── six [required: >=1.5, installed: 1.16.0] | / | 同上 | / |
from apscheduler.schedulers.background import BackgroundScheduler
from flask_apscheduler import APScheduler
import atexit
import fcntl # 只能用于linux
scheduler = APScheduler(BackgroundScheduler(timezone="Asia/Shanghai")) # 定时任务 - 初始化
init.py的create_app()加2条
def create_app():
......
db.app = app # APScheduler实现数据库
db.init_app(app) # 数据库,原本就有的
configure_scheduler(app)
init.py加configure_scheduler(app)方法
加个锁
def configure_scheduler(app):
"""Configure Scheduler"""
f = open("scheduler.lock", "wb")
try:
fcntl.flock(f, fcntl.LOCK_EX | fcntl.LOCK_NB)
scheduler.init_app(app) # 定时任务 - 把任务列表放入 flask
scheduler.start() # 定时任务 - 启动任务列表
except:
pass
def unlock():
fcntl.flock(f, fcntl.LOCK_UN)
f.close()
atexit.register(unlock)
@scheduler.task('interval',minutes=5)
@scheduler.task('cron',hour=23,minute=17)
def xxx():
from app import create_app
app = create_app()
with app.app_context():
xxx # 可以数据库搜索
xxx # 可以使用aap.config
3种方式:
1、date 一次性指定固定时间,只执行一次
run_date(str)– 精确时间
‘run_date’: ‘2021-3-21 17:30:30’
2、interval 间隔调度,隔多长时间执行一次
weeks (int) – 间隔几周
days (int) – 间隔几天
hours (int) – 间隔几小时
minutes (int) – 间隔几分钟
seconds (int) – 间隔多少秒
start_date (datetime|str) – 开始日期
end_date (datetime|str) – 结束日期
3、cron 指定相对时间执行,比如:每月1号、每星期一执行
year (int|str) – 年,4位数字
month (int|str) – 月 (范围1-12)
day (int|str) – 日 (范围1-31)
week (int|str) – 周 (范围1-53)
day_of_week (int|str) – 周内第几天或者星期几 (范围0-6 或者 mon,tue,wed,thu,fri,sat,sun)
hour (int|str) – 时 (范围0-23)
minute (int|str) – 分 (范围0-59)
second (int|str) – 秒 (范围0-59)
start_date (datetime|str) – 最早开始日期(包含)
end_date (datetime|str) – 最晚结束时间(包含)
因为没有上下文,所以调用create_app
修改生效:要ctrl + C 完全切断,再重启才行
enable-threads=true # 允许程序内部启动多线程,为定时器
preload=true # 用--preload启动uWSGI,确保scheduler只在loader的时候创建一次,为定时器
lazy-apps=true