[Python Tips] Apscheduler

Introducing Apscheduler

Apscheduler is a job manager (similar to cron) to run sections of code on a schedule. I use it frequently to manage jobs that need to run at a set interval.

Apscheduler can be used to schedule code execution in three different ways:

  • Cron style scheduling
  • Interval system scheduling
  • One-off execution

Job Persistence

If you want to use a database to store jobs, you can use any of these supported databases:

Apscheduler can be used to save jobs in a database to survive restarts and reboots. The job scheduler can persist as well as run jobs that should have run when it was offline.

  • Any supported SQLAlchemy DB
  • MongoDB
  • Redis
  • RethinkDB
  • ZooKeeper

Installing Apscheduler

I recommend using pip or better yet pipenv

pip install apscheduler

How to use Apscheduler

I am not going to cover all use cases as Apscheduler is a very powerful module. In most cases, I use the BackgroundScheduler but there are seven different schedulers depending on your needs. For example, there is a blocking scheduler if you want to force jobs to be executed in a single thread. There are customized schedulers for Qt, Twisted, Tornado, and Async.

Setup

You have import the correct scheduler you want to use.

from apscheduler.schedulers.background import BackgroundScheduler

You also have to instantiate the scheduler.

scheduler = BackgroundScheduler()

This setup will store the job queue in memory and will not persist across restarts and reboots. You can use a database if you need this functionality.

One of the great things about Apscheduler is that it allows you to easily multi-thread your application without dealing with threads directly.

Adding a job

Once you have the boilerplate finished, you need to add a job. You have two choices here, use add_job() or decorate a function with scheduled_job()

I am going to use add_job() as it is the most straightforward to use.

scheduler.add_job(load_blacklist, 'interval', minutes=10, id='load_blacklist')

In some of my scripts that don't yet support the Global Blacklist API, I load a local copy of my blacklist. I do this using an interval based job schedule every 10 minutes.

Starting the scheduler

Once you have added your jobs, you can start the scheduler.

scheduler.start()

You can also stop and pause the scheduler. You can and list, modify, and remove jobs.

Advanced Usage

There is a lot of advanced functionality in Apscheduler that allows for a ton of customization.

Examples
  • max_instances - By default, Apscheduler supports 10 threads but there is a limit of one instance of any specific job. This allows you to run multiple instances of a specific job at once.
  • misfire_grace_time - This is used to run jobs while the scheduler was unable to run a job because it was offline or busy.

Logging

Apscheduler supports the logging module and has its own logger named apscheduler.

Example logging boiler plate

import logging

logging.basicConfig()
logging.getLogger('apscheduler').setLevel(logging.INFO)

This should give you enough information to see the value of Apscheduler and how to start using it for your Python projects. More information can be found in the Online Documentation and you can find examples in the examples folder.

Apscheduler Github Repo

https://github.com/agronholm/apscheduler

My Python Tips Series

H2
H3
H4
3 columns
2 columns
1 column
11 Comments
Ecency