python技巧

python定时任务模块apscheduler

2018-07-18  本文已影响3人  陆_志东

apscheduler 官方文档
定时任务也可以将处理的结果存到数据库,数据库配置请到官方文档 jobstore里查看用法
apscheduler是python的定时任务框架,下面就是讲解定时任务的使用

apscheduler的安装

pip install apscheduler

apscheduler 模块的三种触发器模式:

  1. cron 定时任务触发器
  2. interval 循环任务触发器
  3. date 一次性任务触发器

下面是程序示例

import datetime
import logging

from apscheduler.schedulers.blocking import BlockingScheduler
import time


def print_time(x):
    time1 = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(time.time()))
    print(time1,"模式:{}".format(x))

def clear_job(job_id):
    scheduler.remove_job(job_id)
    print("{}任务被删除了".format(job_id))

# 创建管理器,实例化一个对象 ,
scheduler = BlockingScheduler()
# 如果想要给定时任务模块添加日志,有两种方式
#方式一:
logging.basicConfig(level=logging.INFO,  # 配置logging配置
                     format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
                     datefmt='%Y-%m-%d %H:%M:%S',
                     filename='log1.txt',  # 指定日志打印到的文件
                     filemode='a')   # 文件的打开方式
scheduler._logger = logging

# 方式二: 是创建一个logger 对象,在程序里面打印日志,使用nohup的方式后台运行程序,
# 然后将程序标准输出和错误输出重定向一个文件里面

# 下面每个任务都添加一个id,方便移除任务,当你想要移除一个任务的时候使用scheduler.remove_job(id) 就可以了

# scheduler.add_job(func=print_time,args=("定时任务",),trigger="cron",day_of_week='0-6', hour=9, minute=5)
#  每天的9点5分执行

scheduler.add_job(func=print_time,args=("定时任务",),trigger="cron",second="*/5" , id="dingshi_1")
# 每5秒执行一次,如果写的second=5,意思是每分钟的第5秒执行


scheduler.add_job(func=print_time,args=("循环任务",),trigger="interval",seconds=3,id="xunhuan_1")
# 每3秒执行一次循环的任务

scheduler.add_job(func=clear_job,args=("xunhuan_1",),trigger="date",next_run_time="2018-07-18 16:56:30")
# 一次性任务需要next_run_time参数指定下次运行的时间
# 这里使用一次性任务删除另外一个循环任务,在现实场景中,可以设定当运行任务到什么程度时,删除其他的任务(remove_job)

scheduler.start()  # start开始定时任务



下面是协程版的定时任务

from datetime import datetime
import os

from apscheduler.schedulers.gevent import GeventScheduler


def tick():
    print('Tick! The time is: %s' % datetime.now())


if __name__ == '__main__':
    scheduler = GeventScheduler()
    scheduler.add_job(tick, 'interval', seconds=3)
    g = scheduler.start()  # g is the greenlet that runs the scheduler loop
    print('Press Ctrl+{0} to exit'.format('Break' if os.name == 'nt' else 'C'))

    # Execution will block here until Ctrl+C (Ctrl+Break on Windows) is pressed.
    try:
        print("没有阻塞111")
        g.join()  # 底层调用的gevent模块,需要安装gevent包,这里调用的join也是协程的join
        # 这里join会阻止程序运行,但如果不join协程会因为线程结束而结束,所以在join之前执行想执行的代码,或者多线程多协程处理
        print("阻塞了222")
    except (KeyboardInterrupt, SystemExit):
        pass
上一篇下一篇

猜你喜欢

热点阅读