• 定时任务


    python中定时任务的实现有很多种方法

    1、最简单的方法:在一个死循环中每隔一定时间执行一次任务

    2、threading.Timer模块:

        在规定的时间间隔后执行一次任务

    from datetime import datetime
    from threading import Timer
    
    def job():
        print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
    
    def jobTask():
        Timer(5, job).start()  # 间隔时间, 任务名称
    
    jobTask()
    
    
    ==============
    5秒过后
    2020-04-13 14:40:57
    

      

    3、标准库sched

       scheduler 类来调度一次事件,从而达到定时执行任务的效果。

      操作步骤:

        1、构造一个sched.scheduler

        它接受两个参数:timefunc(当前时间) 和 delayfunc(暂停运行的时间单元), 一般使用默认参数就行,即 time.time 和 time.sleep。

        2、添加调度任务

        enter(delay, priority, action, argument=(), kwargs={}) 

          delay: 延迟多少秒执行

          priority: 数字越低优先级越高

          action:执行函数

          argument 和 kwargs 分别是函数的位置和关键字参数

        scheduler.enterabs(time, priority, action, argument=(), kwargs={})

          time:任务会在 time 这时刻执行, 其它参数含义同上

    from datetime import datetime
    import sched
    import time
    
    def job():
        print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
    
    def jobTask():
        scheduler = sched.scheduler(time.time, time.sleep) # 初始化任务
        scheduler.enter(2, 1, job) # 2秒后执行一次job任务
        scheduler.run()
    
    jobTask()
    

      

    4、高级python高度器Advanced Python Scheduler, 简称APScheduler。

      是一个轻量级的 Python 定时任务调度框架。APScheduler 支持三种调度任务:

          固定时间间隔

          固定时间点(日期)

          Linux 下的 Crontab 命令

      同时还支持异步执行、后台执行调度任务。

       安装: 

        pip install APScheduler -i https://pypi.tuna.tsinghua.edu.cn/simple  # windows

        pip install apscheduler -i https://pypi.tuna.tsinghua.edu.cn/simple  # linux

       使用方法:

        1、新建调度器

        2、添加后台定时任务

        3、启动

      简单示例:

    import datetime
    import time
    from apscheduler.schedulers.background import BackgroundScheduler
    
    # 将执行的任务
    def job():
        print(datetime.datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3])
    
    scheduler = BackgroundScheduler()  # 组件:新建调度器
    scheduler.add_job(job, 'interval', seconds=2)  # 添加后台任务, 每2秒执行一次
    scheduler.start()  # 开始任务
    
    while True:
        print(time.time())
        time.sleep(1)
    
    # 执行结果
    1586764381.963936
    1586764382.9640276
    2020-04-13 07:53:03.963
    1586764383.9644287
    1586764384.9647956
    2020-04-13 07:53:05.963
    ……
    

      

      组件的分类:

      1、作业存储器job stores
        任务持久化仓库, 默认将任务保存在内存中,也可将任务序列化后保存在各种数据库中,从数据库中加载后再反序列化。
      2、执行器executors
        负责处理作业的运行, 通常将作业提交到线程或进程池中运行。作业完成后通知调度器。
      3、调度器schedulers
        任务调度器属于控制器角色, 它配置作业存储器和执行器在可以在调度器中完成, 如添加、修改、移除作业。
      4、触发器triggers
        调度任务被触发的条件 
     
      

       调度器:

      1、BlockingScheduler : 阻塞当前线程, 在当前进程的主线程中运行。

         2、BackgroundScheduler : 不阻塞当前线程, 在后台线程运行。

      3、AsyncIOScheduler :  结合 asyncio 模块(一个异步框架)一起使用

      4、GeventScheduler : 程序中使用 gevent(高性能的Python并发框架)作为IO模型,和 GeventExecutor 配合使用

      5、TornadoScheduler : 程序中使用 Tornado(一个web框架)的IO模型,用 ioloop.add_timeout 完成定时唤醒。

      6、TwistedScheduler : 配合 TwistedExecutor,用 reactor.callLater 完成定时唤醒

      7、QtScheduler : 应用是一个 Qt 应用,需使用QTimer完成定时唤醒。

      2、触发器

      1、date触发器

        最基本的调度, 在特定的时间点触发, 任务只会执行一次。

    参数 说明 
    run_date(date,datetime或str) 作业的运行日期或时间
    timezone (datetime.tzinfo 或 str) 指定时区

        

    from datetime import datetime
    from datetime import date
    from apscheduler.schedulers.background import BackgroundScheduler
    import time
    
    # 被执行的函数
    def job(text):
        print(text)
    
    # 初始化调度程序
    scheduler = BackgroundScheduler()
    # 被执行的函数  date触发器 执行时间(执行一次)  参数 
    scheduler.add_job(job, 'date', run_date='2020-04-14 11:36:00', args=['text'])
    scheduler.add_job(job, 'date', run_date=datetime(2020, 4, 14, 11, 37, 0), args=['text'])
    
    scheduler.start()
    
    while True:
        time.sleep(10)
        print(time.time())
    

      

      2、interval触发器

      时间间隔触发器, 参数如下

      

    示例:

    import datetime
    import time
    from apscheduler.schedulers.background import BackgroundScheduler
    
    # 被执行的任务
    def job():
        print(datetime.datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3])
    
    # 初始化调度程序
    scheduler = BackgroundScheduler()
    # 被执行函数  interval触发器 间隔参数1分钟
    scheduler.add_job(job, 'interval', minutes=1)
    # 被执行函数  interval触发器 间隔参数1分钟 间隔参数开始时间 间隔参数结束时间
    scheduler.add_job(job, 'interval',minutes=1, start_date='2020-04-14 12:00:10', end_date='2020-04-15 12:10:10')
    
    scheduler.start()
    
    while True:
        time.sleep(10)
        print("ok")
    

      3、cron触发器

       功能最强大的触发器, 在特定时间周期性触发, 和Linux crontab格式兼容。

      参数如下:

      

      支持的运算格式

          

      示例:

    import datetime
    from apscheduler.schedulers.background import BackgroundScheduler
    
    # 被执行的任务
    def job():
        print("当前时间:", datetime.datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3])
    
    # 初始化调度函数
    scheduler = BackgroundScheduler()
    # 任务名称 cron调度器 月份为1-3, 7-9 日为星期一星期二  小时为1:00, 2:00, 3:00
    scheduler.add_job(job, 'cron', month='1-3, 7-9', day='0, tue', hour='0-3')
    scheduler.start()
    

      

       作业存储 job store

        添加job:

        1、add_job(): apscheduler.job.Job 实例, 可改变或移除job

        2、scheduled_job()修饰器来修饰函数: 不会改变的job

      scheduled_job 示例:

    import datetime
    import time
    from apscheduler.schedulers.background import BackgroundScheduler
    
    #初始化调度实例
    scheduler = BackgroundScheduler()
    # 间隔触发器 每1分钟执行一次
    @scheduler.scheduled_job('interval', minutes=1)
    def job():
        print("当前时间:", datetime.datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3])
    
    scheduler.start()
    
    while True:
        time.sleep(10)
        print(time.time())
    
    执行结果:
    [INFO][2020-04-14 14:48:40,293][base.py:440]Adding job tentatively -- it will be properly scheduled when the scheduler starts
    [INFO][2020-04-14 14:48:40,294][base.py:881]Added job "job" to job store "default"
    [INFO][2020-04-14 14:48:40,294][base.py:166]Scheduler started
    1586846930.2962093
    1586846940.297304
    1586846950.2980711
    1586846960.2989216
    1586846970.2994986
    [INFO][2020-04-14 14:49:40,298][base.py:123]Running job "job (trigger: interval[0:01:00], next run at: 2020-04-14 14:49:40 CST)" (scheduled at 2020-04-14 14:49:40.293767+08:00)
    当前时间: 2020-04-14 06:49:40.299
    1586846980.3026278
    [INFO][2020-04-14 14:49:40,299][base.py:144]Job "job (trigger: interval[0:01:00], next run at: 2020-04-14 14:49:40 CST)" executed successfully
    1586846990.3045704
    

      

        移除job

        remove_job(): 创建job时指定一个id, 根据此id删除job

        job.remove():对job执行remove方法

      

    import datetime
    from apscheduler.schedulers.background import BackgroundScheduler
    
    # 初始化调度实例
    scheduler = BackgroundScheduler()
    # 被执行的任务
    def job():
        print("当前时间:", datetime.datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3])
    
    # 添加作业, 指定id
    scheduler.add_job(job,'interval', minutes=2, id='job_one')
    print("job1: ", scheduler.get_jobs())
    # 根据id删除job
    scheduler.remove_job('job_one')
    print("job2: ", scheduler.get_jobs())
    # 添加作业, 返回对象 
    job = scheduler.add_job(job,'interval', minutes=2)
    print("job3: ", scheduler.get_jobs())
    # 根据对象删除job
    job.remove()
    print("job4: ", scheduler.get_jobs())
    
    执行结果:
    [INFO][2020-04-14 15:08:32,005][base.py:440]Adding job tentatively -- it will be properly scheduled when the scheduler starts
    job1:  [<Job (id=job_one name=job)>]
    job2:  []
    [INFO][2020-04-14 15:08:32,006][base.py:627]Removed job job_one
    job3:  [<Job (id=aaba0c4a60ab439492a5e0a4c4c6f879 name=job)>]
    job4:  []
    [INFO][2020-04-14 15:08:32,006][base.py:440]Adding job tentatively -- it will be properly scheduled when the scheduler starts
    [INFO][2020-04-14 15:08:32,007][base.py:627]Removed job aaba0c4a60ab439492a5e0a4c4c6f879
    

      

        获取job列表

        通过 scheduler.get_jobs() 方法能够获取当前调度器中的所有 job 的列表

        修改job

        modify_job(): 根据job id来修改job

        Job.modify() : 根据job实例来修改job

        示例:

    import datetime
    from apscheduler.schedulers.background import BackgroundScheduler
    
    # 初始化调度实例
    scheduler = BackgroundScheduler()
    # 被执行的任务
    def job():
        print("当前时间:", datetime.datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3])
    
    # 添加作业, 指定id
    scheduler.add_job(job,'interval', minutes=2, id='job_one')
    # 根据id修改job
    scheduler.modify_job('job_one', minutes=5)
    # 添加作业, 返回对象
    job = scheduler.add_job(job,'interval', minutes=2)
    # 根据对象修改job
    job.modify( minutes=2)
    

        关闭job

    scheduler.shutdown()
    scheduler.shutdown(wait=false)
    

      

      执行器

      ProcessPoolExecutor:

      ThreadPoolExecutor:

  • 相关阅读:
    循环神经网络(Recurrent Neural Network)
    特征选择
    程序猿能挣多少钱
    python socket
    python 2 encode and decode
    pandas series
    source collection list
    pep8摘要
    python 正则表达式
    django显示图片
  • 原文地址:https://www.cnblogs.com/kongzhagen/p/12691441.html
Copyright © 2020-2023  润新知