python定时任务
指定时间长度后执行的单次任务
DEMO (5s后执行)
import time
from threading import Timer
def func(msg, starttime):
print( '程序启动时刻:', starttime, '当前时刻:', time.time(), '消息内容 --> %s' % (msg))
timer = Timer(5, func, ('hello world', time.time()))
timer.start()
while True:
time.sleep(1024)
固定时间点执行的循环任务
DEMO (每次秒针指向5s时执行)
from apscheduler.schedulers.background import BackgroundScheduler
total = 0
def print_job():
global total
total += 1
print("print_job start.total = {} times".format(total))
if __name__ == '__main__':
scheduler = BackgroundScheduler()
# 周一到周五每分钟的05s执行一次
scheduler.add_job(print_job, 'cron', second=0, minute='*', hour='*', day='*', month='*', day_of_week='mon-fri', year='*')
scheduler.start()
while True:
time.sleep(1024)
固定时间间隔执行的循环任务
DEMO (每小时执行)
import time
from apscheduler.schedulers.background import BackgroundScheduler
INTERVAL = 1 * 60 * 60 # 时间间隔,单位:秒
total = 0
def print_job():
global total
# time.sleep(random.randint(INTERVAL ))
total += 1
print("print_job start.total = {} times".format(total))
if __name__ == '__main__':
scheduler = BackgroundScheduler()
scheduler.add_job(print_job, 'interval', seconds=INTERVAL)
scheduler.start()
while True:
time.sleep(1024)
如果需要使用随机时间启动, 只需要在job函数内添加time.sleep(random.randint(t)) , t为定时任务的启动时间间隔.
cron表达式转换成schedul参数的方法
def cron2schedule(cron):
"""
cron表达式转换成schedule的参数
:param cron: cron表达式
:return: schedule的参数字典
"""
params = cron.split(" ")
kwargs = {}
if len(params) == 6:
arg1, arg2, arg3, arg4, arg5, arg6 = params
kwargs['second'], kwargs['minute'], kwargs['hour'], kwargs['month'] = arg1, arg2, arg3, arg5
kwargs['day'] = arg4 if arg6 == "?" else kwargs['day_of_weak'] = arg6
kwargs['year'] = "*"
else:
arg1, arg2, arg3, arg4, arg5, arg6, arg7 = params
kwargs['second'], kwargs['minute'], kwargs['hour'], kwargs['month'], kwargs['year'] = \
arg1, arg2, arg3, arg5, arg7
if arg4 == "?":
kwargs['day_of_weak'] = arg6
else:
kwargs['day'] = arg4
return kwargs