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