Background Jobs in Flask: Celery and Flask-Scheduler
Introduction
Background jobs allow you to offload time-consuming tasks from the main application, improving performance and user experience. Flask can integrate with tools like Celery for task queues and Flask-Scheduler for periodic jobs.
This article explains step-by-step how to implement background jobs in Flask using Celery and Flask-Scheduler.
Part 1: Task Queues with Celery
Step 1: Install Celery and a Message Broker
Install Celery and a message broker like Redis:
pip install celery redis
Ensure Redis is installed and running:
sudo apt update
sudo apt install redis
sudo systemctl start redis
Step 2: Configure Celery in Your Flask App
Create a celery_app.py file to configure Celery:
from celery import Celery
def make_celery(app):
celery = Celery(
app.import_name,
backend=app.config['CELERY_RESULT_BACKEND'],
broker=app.config['CELERY_BROKER_URL']
)
celery.conf.update(app.config)
return celery
Update your Flask application (app.py):
from flask import Flask
from celery_app import make_celery
app = Flask(__name__)
app.config['CELERY_BROKER_URL'] = 'redis://localhost:6379/0'
app.config['CELERY_RESULT_BACKEND'] = 'redis://localhost:6379/0'
celery = make_celery(app)
@app.route('/long-task')
def long_task():
task = background_task.apply_async()
return f"Task ID: {task.id}"
@celery.task
def background_task():
import time
time.sleep(10) # Simulate a long task
return "Task completed!"
Step 3: Start Celery and Test
Start the Celery worker:
celery -A app.celery worker --loglevel=info
Run the Flask application and access /long-task. Celery processes the task in the background.
Part 2: Periodic Jobs with Flask-Scheduler
Step 1: Install Flask-Scheduler
Install Flask-Scheduler for scheduling cron-like tasks:
pip install flask-apscheduler
Step 2: Configure Flask-Scheduler
Add Flask-Scheduler to your Flask app:
from flask import Flask
from flask_apscheduler import APScheduler
app = Flask(__name__)
scheduler = APScheduler()
def scheduled_task():
print("Running scheduled task")
if __name__ == "__main__":
app.config['SCHEDULER_API_ENABLED'] = True
scheduler.init_app(app)
scheduler.start()
scheduler.add_job(
id='Scheduled Task',
func=scheduled_task,
trigger='interval',
seconds=10
)
app.run(debug=True)
Step 3: Test the Scheduled Task
Run the Flask application. The task logs "Running scheduled task" every 10 seconds to the console.
Conclusion
Using Celery and Flask-Scheduler, you can implement both ad-hoc and periodic background jobs in Flask. This improves the scalability and functionality of your application by efficiently handling tasks.