**Celery Introductie

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.

Learning Objectives

  • De basisprincipes van asynchrone taken begrijpen.
  • Celery installeren en configureren voor gebruik met Flask.
  • Celery taken definiëren en uitvoeren.
  • De resultaten van Celery taken monitoren.

Lesson Content

Inleiding tot Achtergrondtaken en Celery

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.

Celery Installatie en Configuratie

Om Celery te gebruiken, moet je het installeren en configureren. We gebruiken hier Redis als broker, maar RabbitMQ is ook een populaire keuze.

  1. Installatie: Installeer Celery en Redis (of je gekozen broker) met pip:
pip install celery redis
  1. Flask Applicatie Setup: Maak een nieuw Flask project (of gebruik een bestaand project).

  2. 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.

  1. Gebruik Celery in Je Flask App: Importeer in je 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...

Taken Definiëren en Uitvoeren

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).

Resultaten en Status Monitoren

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.).

Deep Dive

Explore advanced insights, examples, and bonus exercises to deepen understanding.

Uitgebreide Les: Achtergrondprocessen in Flask Webapps voor Enterprise Level

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?

Diepe Duik: Meer dan alleen Asynchrone Taken

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:

  • Betrouwbaarheid: Celery kan taken automatisch opnieuw proberen als er iets misgaat (bijv. netwerkproblemen, crashes). Dit zorgt ervoor dat belangrijke taken uiteindelijk voltooid worden.
  • Routing: In grotere systemen wil je taken naar specifieke 'workers' routeren. Celery maakt dit mogelijk met behulp van queues en routing keys, waardoor je de workload verdeelt op basis van taaktype of prioriteit.
  • Scheduling: Naast het direct uitvoeren van taken, kun je Celery gebruiken om taken te plannen. Stel je voor dat je periodieke rapporten wilt genereren of taken wilt uitvoeren op specifieke tijdstippen.
  • Resultaten Backends: Hoewel je de resultaten al hebt leren monitoren, is het belangrijk te weten dat Celery flexibele backends biedt om resultaten op te slaan (bijv. Redis, RabbitMQ, database). Kies de backend die het beste past bij je behoeften.

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.

Bonus Oefeningen

Test je nieuwe kennis met deze bonus oefeningen:

Oefening 1: Herstelmechanisme Implementeren

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.

Oefening 2: Taak-routing met Queues

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.

Oefening 3: Scheduling met Celery Beat

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.

Real-World Connecties

Waar zie je Celery in de praktijk?

  • E-commerce platforms: Het verwerken van duizenden bestellingen tegelijk, het versturen van orderbevestigingen en het updaten van voorraadniveaus.
  • Sociale media: Het verwerken van uploads, het genereren van thumbnails, het verzenden van notificaties en het analyseren van gebruikersgedrag.
  • Financiële systemen: Het uitvoeren van batch-verwerking voor rapporten, het verwerken van transacties en het afhandelen van grote hoeveelheden data.
  • Overheidsinstanties: Het verwerken van burgerzaken, het genereren van rapporten en het beheren van grote datasets.

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.

Daag Jezelf Uit

Probeer deze geavanceerde taken:

  • Implementeer een taak die afhankelijk is van de resultaten van andere taken. Dit creëert een taak 'workflow'.
  • Integreer Celery met een monitoring tool (bijv. Prometheus & Grafana) om statistieken en performance te visualiseren.
  • Onderzoek en implementeer een betere logging strategie voor je Celery taken, inclusief tracking van taakstatus en fouten.

Verdere Leerpaden

Wat kun je hierna doen?

  • Celery advanced configuration: Duik dieper in de configuratie van Celery, inclusief tuning van de worker instellingen voor maximale performance.
  • Distributed systems architecture: Leer over de principes van distributed systems en hoe Celery in een groter context past.
  • Containerization (Docker) en Orchestration (Kubernetes): Leer hoe je Celery workers kunt containerizen en automatisch kunt schalen met Kubernetes voor maximale flexibiliteit.
  • Message brokers: Bestudeer de onderliggende werking van message brokers (zoals RabbitMQ en Redis) om Celery beter te begrijpen.

Tip: Bekijk online tutorials, lees de officiële Celery documentatie en experimenteer! De best practices en real-world cases leren je het meest.

Interactive Exercises

Celery Installatie en Test

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.

E-mail Verzending 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.

Taken Groeperen met Chords en Chains (Extra)

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)

Knowledge Check

Question 1: Wat is de belangrijkste reden om Celery te gebruiken?

Question 2: Welke broker is in de les gebruikt?

Question 3: Hoe definieer je een Celery taak?

Question 4: Welke functie wordt gebruikt om een Celery taak *asynchroon* uit te voeren?

Question 5: Wat is de rol van een Celery broker?

Practical Application

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.

Key Takeaways

Next Steps

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.

Your Progress is Being Saved!

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.

Next Lesson (Day 7)