17. python APScheduler定时任务

 


17. python APScheduler定时任务

17.1 基本概念:

APScheduler 提供了一个强大的调度框架,用于调度任务的执行,它可以用于实现替代linux系统的Cron服务。它支持多种调度方式,并且可以非常灵活地管理任务。APScheduler 主要有以下几个重要概念:

  • 核心组件
    1. 调度器(Scheduler):管理任务的核心,负责任务的整个生命周期,包括创建、启动、暂停等。
    2. 触发器(Trigger):定义任务执行的时间规则。
    3. 存储器(Job Store):存储任务信息(如数据库)。
    4. 执行器(Executor):一般是将任务提交到线程或进程池来执行,任务执行完后,执行器会通知调度器,然后调度器会触发相应的事件,默认的ThreadPoolExecutor足以满足大多数用途,如果工作负载涉及cpu密集型操作,应考虑改用ProcessPoolExecutor。

调度器类型:

APScheduler 提供了不同的调度器,每种调度器适用于不同的场景:

  • BlockingScheduler:阻塞式调度器。通常用于脚本中,调度器会阻塞当前线程,直到调度任务完成。
  • BackgroundScheduler:后台调度器。适用于需要在后台执行调度任务的场景,调度器会在后台线程中运行,不会阻塞主线程。
  • AsyncIOScheduler:适用于异步编程,专为 asyncio 环境设计。

调度方式(触发器):

APScheduler 提供了三种常见的调度方式:

  • Interval Trigger(间隔触发):按照指定的时间间隔重复执行任务。
  • Cron Trigger(Cron触发):基于 cron 表达式,支持复杂的时间调度规则。
  • Date Trigger(日期触发):在指定的日期和时间执行任务。

17.2 安装:

pip install apscheduler

17.3 简单示例

1)BlockingScheduler

#!/usr/bin/python3
#_*_coding:utf-8_*_
from apscheduler.schedulers.blocking import BlockingScheduler
from datetime import datetime


def job1():
    print(f"系统当前时间: {datetime.now()}")


def job2():
    print("Hello")

#创建调度器,阻塞当前进程持续运行
scheduler = BlockingScheduler()
#添加任务,每5秒钟执行一次job1
scheduler.add_job(job1,'interval',seconds=5)
#添加任务,每1分钟执行一次job2
scheduler.add_job(job2,'cron',minute='*')
try:
    scheduler.start()
except (SystemExit,KeyboardInterrupt):
    scheduler.shutdown()

2)BackgroundScheduler

#!/usr/bin/python3
#_*_coding:utf-8_*_
from apscheduler.schedulers.background import BackgroundScheduler
from datetime import datetime
import time

def job1():
    print(f"系统当前时间: {datetime.now()}")


def job2():
    print("Hello")

#创建调度器,不会阻塞进程
scheduler = BackgroundScheduler()
#添加任务,每5秒钟执行一次job1
scheduler.add_job(job1,'interval',seconds=5)
#添加任务,每1分钟执行一次job2
scheduler.add_job(job2,'cron',minute='*')
scheduler.start()
#不会阻塞进程,执行完start()后结束该任务,添加死循环持续运行该进程
try:
    while True:
        time.sleep(1)
except (SystemExit,KeyboardInterrupt):
    scheduler.shutdown()

定时推送钉钉机器人消息:

#!/usr/bin/python3
#_*_coding:utf-8_*_
import time
import requests
import json
from apscheduler.schedulers.background import BackgroundScheduler


def send_dingding(webhook_url,keyboard,title,content):
    headers = {"Content-Type": "application/json"}
    data = {
        'msgtype': 'markdown',
        'markdown': {
            'title': title,
            'text': f"# {title}\n\n{keyboard}\n\n{content}"
        }
    }
    response = requests.post(webhook_url,headers=headers,data=json.dumps(data))
    if response.status_code == 200 and response.json().get("errcode") == 0:
        print('消息推送成功')
    else:
        print(f'消息发送失败: {response.json().get("errmsg")}')

def job(webhook_url,keyboard,title):
    content = f"定时推送测试:{time.strftime('%Y-%m-%d %H:%M:%S')}"
    send_dingding(webhook_url,keyboard,title,content)


if __name__ == '__main__':
    webhook_url = 'https://oapi.dingtalk.com/robot/send?access_token=your_token'	#your_token替换你的token
    keyboard = 'shy'
    title =  '无人值守机器人消息:'
    # 创建后台调度器
    scheduler = BackgroundScheduler()
    scheduler.add_job(job,'interval',seconds=5,args=[webhook_url,keyboard,title])
    scheduler.start()
    try:
        while True:
            time.sleep(1)
    except  (KeyboardInterrupt,SystemExit):
        scheduler.shutdown()

监控系统性能每天定时推送钉钉机器人消息:

#!/usr/bin/python3
#_*_coding:utf-8_*_
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.triggers.cron import CronTrigger
from datetime import datetime
import psutil
import time
import requests
import json


def cpu():
    return psutil.cpu_percent(interval=1)


def mem():
    return psutil.virtual_memory().percent


def job(url,keyboard,title):
    content = []
    cpu_persent = int(cpu())
    mem_persent = int(mem())
    if cpu_persent >= 70:	
        content.append(f"{datetime.now().strftime('%Y-%m-%d %H:%M:%S')} cpu使用率高: {cpu_persent}%")
    if mem_persent >= 70:
        content.append(f"{datetime.now().strftime('%Y-%m-%d %H:%M:%S')} 内存使用率高: {mem_persent}%")
    if cpu_persent <=1 and mem_persent <=10:
        content.append(f"{datetime.now().strftime('%Y-%m-%d %H:%M:%S')} 系统性能正常")
    send_dingding(url,keyboard,title,content)


def send_dingding(url,keyboard,title,content):
    headers = {"Content-Type": "application/json"}
    content_text = "\n\n".join(content)
    data = {
        "msgtype": "markdown",
        "markdown": {
            "title": title,
            "text": f"# {title}\n\n{keyboard}\n\n{content_text}"
        }
    }
    response = requests.post(url,data=json.dumps(data),headers=headers)
    # if response.status_code == 200 and response.json.get("errcode") == 0:
    #     pass


def main():
    url = 'https://oapi.dingtalk.com/robot/send?access_token=your_token'	#your_token替换你的token
    keyboard = 'shy'
    title = '无人值守机器人消息:'
    scheduler = BackgroundScheduler()
    scheduler.add_job(job,
                      trigger=CronTrigger(hour='8,10,12,14,16,18,23',minute=0,second=0),
                      name='每天定时任务',
                      id='1222',
                      args=[url,keyboard,title])
    scheduler.start()
    try:
        while True:
            time.sleep(1)
    except (KeyboardInterrupt,SystemExit):
        scheduler.shutdown()


if __name__ == '__main__':
    main()
posted @   逃离这世界~  阅读(6)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示

目录导航