python实现定时任务的几种方案

celery引入及使用参考其他文章

还有这个包可使用,具体搜索使用文档:function_scheduling_distributed_framework 

# -*-coding:utf-8 -*-
'''
@desc: 几种定时任务实现
'''
import datetime
import sched
import threading
import time

from apscheduler.schedulers.blocking import BlockingScheduler

"""
第一种: while + sleep
"""
def task1():
    while True:
        print("每10秒执行一次:%s" % int(time.time()))
        time.sleep(10)


"""
第二种: threading模块中的Timer是一个非阻塞函数,可以启动多个定时任务,这些定时器任务是异步执行,不存在等待顺序执行问题
"""
def task2():
    t = threading.Timer(5, task_func2)
    t.start()

def task_func2():
    print("每隔五秒执行一次:%s" % int(time.time()))


"""
第三种: sched模块,实现了一个通用事件调度器,在调度器类使用一个延迟函数等待特定的时间,执行任务。同时支持多线程应用程序,
在每个任务执行后会立刻调用延时函数,以确保其他线程也能执行,注意前面的任务耗时过长,则后面的任务将顺延执行
"""
def task3():
    s = sched.scheduler(time.time, time.sleep)
    # 注册任务
    # 5:间隔时间
    # 1:优先级
    # task_func3:执行函数
    # ():参数
    s.enter(5, 1, task_func3, ())
    s.enter(2, 1, task_func3_1, ())
    # s.cancel(task_func3)
    s.run()


def task_func3():
    now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    print("每隔5秒执行,执行时间:%s" % now)

def task_func3_1():
    now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    print("每隔2秒执行,执行时间:%s" % now)
    time.sleep(1)


"""
第四种: APScheduler,基于Quartz的一个Python定时任务框架,实现了 Quartz 的所有功能,使用起来十分方便。提供了基于日期、固定时间间隔以及 crontab 类型的任务,并且可以持久化任务
目前 APScheduler 支持触发器:
    指定时间的 DateTrigger
    指定间隔时间的 IntervalTrigger
    Linux的crontab 一样的 CronTrigger。

触发器参数:interval
    interval 间隔调度
    weeks (int) – 间隔几周
    days (int) – 间隔几天
    hours (int) – 间隔几小时
    minutes (int) – 间隔几分钟
    seconds (int) – 间隔多少秒
    start_date (datetime|str) – 开始日期
    end_date (datetime|str) – 结束日期
触发器参数:cron

cron 调度

    (int|str) 表示参数既可以是 int 类型,也可以是 str 类型
    (datetime | str) 表示参数既可以是 datetime 类型,也可以是 str 类型
    year (int|str) – 4-digit year -(表示四位数的年份,如 2008 年)
    month (int|str) – month (1-12) -(表示取值范围为 1-12 月)
    day (int|str) – day of the (1-31) -(表示取值范围为 1-31 日)
    week (int|str) – ISO week (1-53) -(格里历 2006 年 12 月 31 日可以写成 2006 年-W52-7(扩展形式)或 2006W527(紧凑形式))
    day_of_week (int|str) – number or name of weekday (0-6 or mon,tue,wed,thu,fri,sat,sun) – (表示一周中的第几天,既可以用 0-6 表示也可以用其英语缩写表示)
    hour (int|str) – hour (0-23) – (表示取值范围为 0-23 时)
    minute (int|str) – minute (0-59) – (表示取值范围为 0-59 分)
    second (int|str) – second (0-59) – (表示取值范围为 0-59 秒)
    start_date (datetime|str) – earliest possible date/time to trigger on (inclusive) – (表示开始时间)
    end_date (datetime|str) – latest possible date/time to trigger on (inclusive) – (表示结束时间)
"""
def task4():
    blocking_sched = BlockingScheduler()
    # blocking_sched.add_job(task_func4, 'interval', seconds=3, args=["111"], id="task4")
    blocking_sched.add_job(task_func4, 'date', run_date=datetime.datetime(2022, 7, 19, 14, 25, 20), args=["111"], id="task4")
    blocking_sched.remove_job("task4")
    # 6-8,11-12 月第三个周五 00:00, 01:00, 02:00, 03:00 运行
    # blocking_sched.add_job(task_func4, 'cron', month='6-8,11-12', day='3rd fri', hour='0-3')

    # 每周一到周五运行 直到 2024-05-30 00:00:00
    # blocking_sched.add_job(task_func4, 'cron', day_of_week='mon-fri', hour=5, minute=30, end_date='2024-05-30')
    blocking_sched.start()



def task_func4(params):
    # print(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
    print("接收的参数是: %s" % params)


if __name__ == '__main__':
    # task1()

    # for v in range(4):
    #     task2()

    # for v in range(4):
    #     task3()

    task4()
    pass

你可能感兴趣的:(python基础,python,开发语言)