python 定时器

1、BlockingScheduler库

缺点:会阻塞代码

优点:调用定时函数时方便灵活定义定时,比如间隔多长时间调用一次,比如那几个月调用一次

代码:

from apscheduler.schedulers.blocking import BlockingScheduler
import datetime

# 这个定时是阻塞定时
# 循环调用
# 该定时器的函数可以随意定时间,包括每天或者某一天,某几个月的,哪个时间点进行触发

'''
首先看看周一到周五定时执行任务


# 输出时间
def job():
    print(datetime.now().strtime("%Y-%m-%d %H:%M:%S"))


# BlockingScheduler
scheduler = BlockingScheduler()
scheduler.add_job(job, "cron", day_of_week = "1-5", hour = 6, minute = 30)
schduler.start()

scheduler.add_job(job, 'cron', hour=1, minute=5)

hour = 19, minute = 23
这里表示每天的19:23
分执行任务
hour = '19', minute = '23'
这里可以填写数字,也可以填写字符串
hour = '19-21', minute = '23'
表示
19: 23、 20: 23、 21: 23
各执行一次任务

# 每300秒执行一次
scheduler.add_job(job, 'interval', seconds=300)

# 在1月,3月,5月,7-9月,每天的下午2点,每一分钟执行一次任务
scheduler.add_job(func=job, trigger='cron', month='1,3,5,7-9', day='*', hour='14', minute='*')

# 当前任务会在 6、7、8、11、12 月的第三个周五的 0、1、2、3 点执行
scheduler.add_job(job, 'cron', month='6-8,11-12', day='3rd fri', hour='0-3')

# 从开始时间到结束时间,每隔俩小时运行一次
scheduler.add_job(job, 'interval', hours=2, start_date='2018-01-10 09:30:00', end_date='2018-06-15 11:00:00')


'''



def startCronTask(task, **config):
    # BlockingScheduler
    scheduler = BlockingScheduler()
    scheduler.add_job(task, 'interval', **config)
    scheduler.start()


def userCountFunc():
    # 获取当前时间
    current_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    print(current_time)
    print("hello world")
    # 获取当前时间
    current_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    print(current_time)


def main():
    # 获取当前时间
    current_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    print(current_time)
    startCronTask(userCountFunc, minutes=1)

    # 获取当前时间
    current_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    print(current_time)

if __name__ == '__main__':
    main()

2、threading

线程定时

缺点:需要在定时器执行函数内部重复构造定时器,才能达到重复循环定时的目的

优点:不阻塞程序

代码:

import threading
import datetime
import time

# 使用threading线程定时,该定时不堵塞


# 如果需要传参
def timerFunc():
    print('Hello World~')

    #想要进行循环定时必须在定时器执行函数内部重复构造定时器,因为定时器构造后只执行1次,必须循环调用
    ''''''
    global timer
    timer = threading.Timer(10, timerFunc)
    timer.start()

# 此处要用引用函数的格式timerFunc,而不是运行函数的格式timerFunc(),不然会报错
timer = threading.Timer(10, timerFunc)
timer.start()
# 如果调用的函数需要传参
'''
#函数名后以逗号分割进行传参
timer = threading.Timer(10, timerFunc,"a")
timer.start()
'''


time.sleep(60)
# 取消定时
timer.cancel()

备注:threading模块传参的时候可以在调用函数名后,以,分割,直接赋值。

平常建议使用第二种,不堵塞,用起来也简单,快。

第一种使用想解决堵塞应该可以用多线程和多进程,来防止定时器执行函数堵塞代码。

申明:本人菜鸡,该文章只做个人记录、备忘使用,出现错误请海涵。

目录

1、BlockingScheduler库

2、threading


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值