How To Schedule A Function To Run Every Hour In Flask?

Published August 7, 2024

Problem: Scheduling Hourly Tasks in Flask

Scheduling functions to run at set times is a common need in web applications. Flask, a popular Python web framework, does not have built-in task scheduling features. This creates a problem when trying to run a function every hour within a Flask application.

Using APScheduler: A Solution for Flask Task Scheduling

Setting Up APScheduler in Your Flask Application

To use APScheduler in your Flask application, install it using pip:

pip install apscheduler

Import the needed modules in your Flask application:

from apscheduler.schedulers.background import BackgroundScheduler
import atexit

Configuring the BackgroundScheduler

Create a BackgroundScheduler instance:

scheduler = BackgroundScheduler()

Define the function you want to schedule. For example:

def hourly_task():
    # Your code here
    print("This function runs every hour")

Adding a Job to Run Every Hour

Use the add_job() method to schedule your function:

scheduler.add_job(func=hourly_task, trigger="interval", hours=1)

This sets up the hourly_task function to run every hour using the interval trigger.

Tip: Flexible Scheduling Options

APScheduler offers various trigger types for scheduling. Besides "interval", you can use "cron" for more complex scheduling patterns or "date" for one-time execution at a specific date and time.

Starting and Managing the Scheduler

Start the scheduler:

scheduler.start()

To handle scheduler shutdown when the application exits, use the atexit module:

atexit.register(lambda: scheduler.shutdown())

This makes sure that the scheduler stops cleanly when your Flask application shuts down.

Alternative Approaches for Flask Task Scheduling

Using Flask-APScheduler Extension

Flask-APScheduler is an extension that makes it easier to use APScheduler in Flask applications. It works well with Flask and supports different scheduler types.

Benefits of using Flask-APScheduler:

  • Works with Flask's configuration system
  • Supports multiple scheduler types (background, gevent, asyncio)
  • Offers job store options (memory, SQLAlchemy, MongoDB)

Basic setup and configuration:

  1. Install Flask-APScheduler:

    pip install Flask-APScheduler
  2. Import and set up the extension:

    
    from flask import Flask
    from flask_apscheduler import APScheduler

app = Flask(name) scheduler = APScheduler() scheduler.init_app(app) scheduler.start()


3. Create and add jobs:
```python
@scheduler.task('cron', id='do_job_1', hour='*')
def job1():
    print('Job 1 executed')

Tip: Use APScheduler's Interval Trigger

To run a task at regular intervals, use the 'interval' trigger type. For example:

@scheduler.task('interval', id='do_job_2', seconds=30)
def job2():
    print('Job 2 executed every 30 seconds')

This sets up a task that runs every 30 seconds.

Using Celery for More Complex Task Management

Celery is a task queue that can handle complex task scheduling and processing in Flask applications.

About Celery:

  • It's an asynchronous task queue that uses distributed message passing
  • It supports real-time processing and scheduled tasks
  • Celery uses brokers (like RabbitMQ or Redis) to connect clients and workers

When to use Celery instead of APScheduler:

  • For apps with many tasks to process
  • When you need to run tasks on multiple servers
  • If you need features like task prioritization, retries, and monitoring
  • When your app needs to grow to handle more work

To use Celery with Flask, you need to set up a Celery instance, set up a broker, and create tasks as Celery tasks. This setup is more complex than APScheduler but offers more options for large apps.