In deze les duiken we in Celery, een krachtige task queue voor Python. Je leert hoe Celery taken op de achtergrond kan uitvoeren in je Flask webapplicaties, wat de responsiviteit verbetert en complexe processen efficiënt afhandelt.
Webapplicaties kunnen soms taken hebben die veel tijd in beslag nemen, zoals het verwerken van grote bestanden, het versturen van e-mails of het draaien van complexe berekeningen. Als deze taken direct in de webserver worden uitgevoerd, blokkeren ze de verwerking van andere verzoeken, wat de gebruikerservaring negatief beïnvloedt. Celery is een gedistribueerde task queue die dit probleem oplost door taken op de achtergrond, asynchroon uit te voeren. Dit zorgt ervoor dat je Flask applicatie snel en responsief blijft.
Celery werkt met een broker (zoals RabbitMQ of Redis) die de taken beheert en doorstuurt naar worker processen. Deze workers voeren de taken uit en melden de resultaten terug.
Om Celery te gebruiken, moet je het installeren en configureren. We gebruiken hier Redis als broker, maar RabbitMQ is ook een populaire keuze.
pip install celery redis
Flask Applicatie Setup: Maak een nieuw Flask project (of gebruik een bestaand project).
Celery Config: Maak een celery.py
bestand in de root van je project met de volgende configuratie:
from celery import Celery
app = Celery('myapp', broker='redis://localhost:6379/0') # Vervang 'myapp' met je applicatie naam
# Optionele configuratie instellingen
app.conf.update(
CELERY_TASK_SERIALIZER='json',
CELERY_RESULT_SERIALIZER='json',
CELERY_ACCEPT_CONTENT=['json'],
CELERY_TIMEZONE='Europe/Amsterdam',
CELERY_ENABLE_UTC=True,
)
Vervang 'myapp' door de naam van je Flask applicatie. De broker
parameter geeft aan waar je Celery broker draait (in dit geval Redis op localhost:6379). De configuratie instellingen optimaliseren de serialisatie en tijdzone.
app.py
(of main Flask bestand) de Celery app:from flask import Flask
from .celery import app as celery_app # Importeer de celery app
app = Flask(__name__)
#... je andere Flask routes en code...
Een Celery taak is in feite een Python functie die asynchroon wordt uitgevoerd. Je defineert ze met de @app.task
decorator (waarbij app
verwijst naar je Celery applicatie).
from celery import shared_task
# Flask code is niet relevant in dit voorbeeld,
@shared_task
def add(x, y):
return x + y
# Flask code...
Om deze taak uit te voeren, roep je ze aan vanuit je Flask applicatie:
from flask import Flask, render_template, request
from .celery import app
app = Flask(__name__)
@app.route('/add')
def add_numbers():
x = int(request.args.get('x', 0))
y = int(request.args.get('y', 0))
result = add.delay(x, y) # Voer de taak asynchroon uit
return f'De som van {x} en {y} wordt berekend. Task ID: {result.id}' # Geef de Task ID terug
In dit voorbeeld gebruikt add.delay(x, y)
Celery om de add
functie asynchroon uit te voeren. De resultaten zijn niet direct beschikbaar, maar de result.id
is de identificatie van de Celery task. Dit kan gebruikt worden om de status te checken (zie volgende sectie).
Nadat je een taak hebt uitgevoerd, kun je de resultaten en status monitoren. Celery biedt functies om de status van taken op te vragen en de resultaten te verkrijgen.
from celery.result import AsyncResult
from flask import Flask, render_template, request
from .celery import app
app = Flask(__name__)
@app.route('/result/<task_id>')
def task_status(task_id):
result = AsyncResult(task_id, app=app)
if result.ready():
return f'Taak is voltooid. Resultaat: {result.get()}'
else:
return f'Taak nog in uitvoering. Status: {result.status}'
#... de andere routes
In dit voorbeeld gebruikt /result/<task_id>
de AsyncResult
klasse om de status van een taak op te vragen, op basis van de Task ID die eerder werd teruggegeven. result.ready()
checkt of de taak voltooid is. result.get()
haalt het resultaat op als de taak voltooid is. result.status
geeft de status terug (PENDING, STARTED, SUCCESS, FAILURE, etc.).
Explore advanced insights, examples, and bonus exercises to deepen understanding.
Dag 6! We zijn al halverwege onze cursus en duiken dieper in de wereld van achtergrondprocessen in je Flask webapplicaties. Vandaag bouwen we verder op de introductie van Celery, de task queue die je hebt leren kennen. We gaan dieper in op configuratie, monitoring en de implementatie van geavanceerde technieken die cruciaal zijn voor enterprise-level applicaties. We gaan kijken naar de 'waarom' achter Celery en hoe je de voordelen ervan optimaal kunt benutten. Klaar om je Celery skills naar een hoger niveau te tillen?
We hebben Celery geïntroduceerd als een manier om taken asynchroon uit te voeren. Maar Celery is veel meer dan dat. Het is een volwaardige distributed task queue systeem, ontworpen voor schaalbaarheid en betrouwbaarheid. Denk aan het volgende:
Alternative: Overweeg alternatieven zoals Flask-RQ (Redis Queue). Flask-RQ is eenvoudiger te configureren voor kleinere projecten, maar mist de flexibiliteit en schaalbaarheid van Celery. RQ is wellicht een goede keuze voor kleinere applicaties waar Celery 'overkill' zou zijn.
Test je nieuwe kennis met deze bonus oefeningen:
Implementeer een basis herstelmechanisme voor een Celery taak. Maak een taak die mislukt (bijv. door een uitzondering te genereren) en configureer Celery om deze taak automatisch opnieuw te proberen na een bepaalde periode of een bepaald aantal keer.
Maak twee Celery workers en configureer Celery om taken van verschillende types naar verschillende queues te sturen. Bijvoorbeeld, één queue voor "afbeeldingsverwerking" en een andere voor "emailverzending". Dit simuleert het verdelen van de workload over verschillende servers.
Gebruik Celery Beat om een taak te plannen die periodiek wordt uitgevoerd, bijvoorbeeld elke 5 minuten. Deze taak kan bijvoorbeeld data ophalen uit een externe API of logbestanden opschonen.
Waar zie je Celery in de praktijk?
In Nederland zien we dit bijvoorbeeld bij grote webshops als Bol.com, Coolblue, of in de backend van grote nieuwswebsites die continu thumbnails moeten genereren, artikelen publiceren, etc.
Probeer deze geavanceerde taken:
Wat kun je hierna doen?
Tip: Bekijk online tutorials, lees de officiële Celery documentatie en experimenteer! De best practices en real-world cases leren je het meest.
Installeer Celery en Redis. Maak een eenvoudig Flask project en configureer Celery zoals beschreven in de les. Maak een eenvoudige taak die twee getallen optelt en roep deze aan vanuit een route in je Flask applicatie. Controleer de status van de taak.
Maak een Celery taak die een e-mail verstuurt. Implementeer een Flask route die deze taak aanroept. Gebruik een dummy SMTP server (zoals mailtrap.io) om de e-mails te testen, zodat je ze daadwerkelijk kan zien.
Lees je in over Celery's 'chords' en 'chains'. Probeer een chain te implementeren waarbij een taak een andere taak aanroept, en vervolgens een derde taak. (Dit is wat geavanceerder, dus dit is meer optioneel)
Een webshop heeft een functionaliteit om grote productafbeeldingen te uploaden. Gebruik Celery om de taak van het comprimeren van de afbeeldingen en het genereren van thumbnails naar de achtergrond te verplaatsen, zodat de gebruiker sneller feedback krijgt na het uploaden.
Lees meer over geavanceerde Celery concepten zoals Celery Flower (monitoring tool) en scheduling van taken. Bereid je voor op de volgende les over databases in Flask.
We're automatically tracking your progress. Sign up for free to keep your learning paths forever and unlock advanced features like detailed analytics and personalized recommendations.