pip install apscheduler -i https://mirrors.aliyun.com/pypi/simple/


定义一个需定时执行的方法

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

启动定时任务

    scheduler = BlockingScheduler()
    scheduler.add_job(job, 'cron', day_of_week='1-5', hour=21, minute=51, second=1)
    scheduler.start()

添加job有两种方式:

  • add_job():可返回一个apscheduler.job.Job 的实例,可以用来改变或者移除 job
  • scheduled_job():只适用于应用运行期间不会改变的 job


移除 job 也有两种方法:

  • remove_job():使用 jobId 移除
  • job.remove():使用 add_job() 返回的实例移除


# 使用返回的实例移除
job = scheduler.add_job(myfunc, 'interval', minutes=2)
job.remove()
# 使用设置的ID移除
scheduler.add_job(myfunc, 'interval', minutes=2, id='my_job_id')
scheduler.remove_job('my_job_id')

暂停和恢复 job:

# 暂停 Job
apscheduler.job.Job.pause()
apscheduler.schedulers.base.BaseScheduler.pause_job()

# 恢复 Job
apscheduler.job.Job.resume()
apscheduler.schedulers.base.BaseScheduler.resume_job()


获取 job 列表:

获得可调度 job 列表,可以使用get_jobs() 来完成,它会返回所有的 job 实例。

也可以使用print_jobs() 来输出所有格式化的 job 列表。


修改 job

除了 jobID 之外 job 的所有属性都可以修改,使用 apscheduler.job.Job.modify() 或者 modify_job() 修改一个 job 的属性

job.modify(max_instances=6, name='Alternate name')
modify_job('my_job_id', trigger='cron', minute='*/5')


关闭 job

默认情况下调度器会等待所有的 job 完成后,关闭所有的调度器和作业存储。将 wait 选项设置为 False 可以立即关闭。

scheduler.shutdown()
scheduler.shutdown(wait=False)


配置调度器

调度器的主循环其实就是反复检查是不是有到时需要执行的任务,分以下几步进行:

  1. 询问自己的每一个作业存储器,有没有到期需要执行的任务,如果有,计算这些作业中每个作业需要运行的时间点,如果时间点有多个,做 coalesce 检查。
  2. 提交给执行器按时间点运行。



在配置调度器前,我们首先要选取适合我们应用环境场景的调度器,存储器和执行器。下面是各调度器的适用场景:


  • BlockingScheduler:适用于调度程序是进程中唯一运行的进程,调用start函数会阻塞当前线程,不能立即返回。
  • BackgroundScheduler:适用于调度程序在应用程序的后台运行,调用start后主线程不会阻塞。
  • AsyncIOScheduler:适用于使用了asyncio模块的应用程序。
  • GeventScheduler:适用于使用gevent模块的应用程序。
  • TwistedScheduler:适用于构建Twisted的应用程序。
  • QtScheduler:适用于构建Qt的应用程序。