A task queue helps your Flask app do long jobs in the background. This keeps the app fast and responsive for users.
Task queue concept in Flask
from flask import Flask from flask_sqlalchemy import SQLAlchemy from rq import Queue from redis import Redis app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db' db = SQLAlchemy(app) redis_connection = Redis() task_queue = Queue('default', connection=redis_connection) def background_task(n): """Example task that runs in the background.""" print(f"Working on task {n}") return f"Task {n} done"
You need Redis installed and running for the queue to work.
Use rq library to create and manage task queues in Flask.
background_task(5) later.from rq import Queue from redis import Redis redis_connection = Redis() task_queue = Queue('default', connection=redis_connection) # Add a task to the queue job = task_queue.enqueue(background_task, 5) print(job.get_id())
# What if Redis is not running? try: redis_connection = Redis() redis_connection.ping() except Exception as error: print("Redis server is not available.")
# What if the task queue is empty? if task_queue.is_empty(): print("No tasks to process right now.")
background_task(10) to run 10 minutes later.# What if you want to schedule a task for later? import datetime from rq_scheduler import Scheduler scheduler = Scheduler(connection=redis_connection) scheduler.enqueue_at(datetime.datetime.utcnow() + datetime.timedelta(minutes=10), background_task, 10)
This Flask app has an endpoint /start-task that starts a background task to sleep for a given number of seconds. The task runs in the background, so the app stays responsive.
from flask import Flask, request, jsonify from rq import Queue from redis import Redis import time app = Flask(__name__) redis_connection = Redis() task_queue = Queue('default', connection=redis_connection) def background_task(seconds): """Simulate a long task by sleeping.""" print(f"Starting task for {seconds} seconds") time.sleep(seconds) print(f"Finished task for {seconds} seconds") return f"Slept for {seconds} seconds" @app.route('/start-task', methods=['POST']) def start_task(): data = request.get_json() or {} seconds = data.get('seconds', 5) job = task_queue.enqueue(background_task, seconds) return jsonify({'message': 'Task started', 'job_id': job.get_id()}) if __name__ == '__main__': app.run(debug=True)
Task queues let your app handle slow jobs without making users wait.
Time complexity depends on the task itself, but queue operations are usually fast (O(1)).
Common mistake: forgetting to run a worker process that actually executes queued tasks.
Use task queues when you want to do work later or in parallel, not for instant responses.
Task queues run slow jobs in the background so your Flask app stays fast.
Redis and rq are popular tools to create task queues in Flask.
Always run a worker to process tasks from the queue.
Practice
Solution
Step 1: Understand task queue role
Task queues let slow jobs run separately from the main app, so the app stays responsive.Step 2: Identify the correct purpose
Running slow tasks in the background matches the main purpose of task queues.Final Answer:
To run slow or long tasks in the background without blocking the main app -> Option BQuick Check:
Task queue purpose = background slow jobs [OK]
- Confusing task queues with caching
- Thinking task queues handle authentication
- Assuming task queues speed up static file serving
Solution
Step 1: Recall rq enqueue method
In rq, tasks are added to the queue using the enqueue() method.Step 2: Match method to options
Only queue.enqueue(my_task, arg1, arg2) uses enqueue() correctly with task and arguments.Final Answer:
queue.enqueue(my_task, arg1, arg2) -> Option AQuick Check:
rq enqueue method = enqueue() [OK]
- Using run(), start(), or execute() instead of enqueue()
- Forgetting to pass task arguments
- Calling enqueue on wrong object
from rq import Queue
from redis import Redis
redis_conn = Redis()
queue = Queue(connection=redis_conn)
def add(x, y):
return x + y
job = queue.enqueue(add, 3, 4)
print(job.result)What will be printed immediately after running this code?
Solution
Step 1: Understand rq job processing
When a job is enqueued, it runs asynchronously. The result is not ready immediately.Step 2: Check job.result value right after enqueue
Immediately after enqueue, job.result is None because the worker hasn't processed it yet.Final Answer:
None -> Option AQuick Check:
job.result before worker runs = None [OK]
- Assuming job.result is ready immediately
- Expecting synchronous return value
- Confusing job.result with function return
queue.enqueue(my_task, arg1, arg2)
But the task never runs. What is the most likely reason?
Solution
Step 1: Check rq worker role
rq worker must be running to process tasks from the queue.Step 2: Identify missing worker
If tasks never run, the worker process is likely not started.Final Answer:
You forgot to start the rq worker process -> Option CQuick Check:
Worker must run to process tasks [OK]
- Assuming enqueue runs task immediately
- Not starting rq worker process
- Confusing Redis installation with worker running
Solution
Step 1: Setup Redis and rq Queue
You must create a Redis connection and pass it to rq Queue to enqueue tasks properly.Step 2: Run rq worker separately
The rq worker must be started manually in the terminal to process queued tasks.Final Answer:
Create Redis connection, create rq Queue with it, enqueue task; run rq worker in terminal -> Option DQuick Check:
Redis + rq Queue + worker process = correct setup [OK]
- Calling task function directly instead of enqueueing
- Assuming worker runs automatically
- Using Flask threading instead of task queue
Ready to prove it?
Pass the test and this pattern moves unknown
