In het vorige deel hebben we via Django-Celery-Beat: Hoe je een geplande taak aanmaakt de basisprincipes van het aanmaken van een geplande taak in Django-Celery-Beat bekeken.

📌 Klik op de titel om de vorige post ook te bekijken!

Echter, in echte projecten is het simpelweg elke keer op een gepland tijdstip uitvoeren vaak niet voldoende.

  • Je moet mogelijk de uitvoering beperken tot specifieke tijden,
  • de uitvoeringsfrequentie dynamisch aanpassen,
  • de taak deactiveren onder specifieke voorwaarden, of
  • instellen dat de reservering automatisch wordt opgeheven na een bepaalde datum.

Om deze complexe logica aan te pakken, zullen we in dit deel dieper ingaan op het PeriodicTask-model van Django-Celery-Beat en de verschillende velden en instellingen bekijken! 🚀

Django Celery-Beat PeriodicTask illustratie

1️⃣ Instelling van PeriodicTask met update_or_create

In echte services is het vaak nuttiger om een eenmaal aangemaakte geplande taak te wijzigen in plaats van deze te laten staan.

Daarom is het handiger om gebruik te maken van de update_or_create() methode in plaats van PeriodicTask.objects.create().

📌 Als je update_or_create() gebruikt,

  1. wordt een bestaande taak geüpdatet
  2. en wordt er een nieuwe aangemaakt als deze niet bestaat

Dat betekent dat het mogelijk is om een geplande taak met dezelfde naam te overschrijven, wat onnodige duplicaten voorkomt.

2️⃣ PeriodicTask.interval veld en IntervalSchedule model

De PeriodicTask van Django-Celery-Beat maakt het mogelijk om de herhalingsfrequentie in te stellen via het interval veld.

Dit interval veld is verbonden met het IntervalSchedule model, dus je moet eerst een IntervalSchedule instantie aanmaken en deze vervolgens in de PeriodicTask verwijzen.

Dat wil zeggen, om een geplande taak te registreren:

  1. Eerst een IntervalSchedule instantie aanmaken
  2. verbind vervolgens de gemaakte IntervalSchedule met de PeriodicTask

3️⃣ IntervalSchedule veldopties

Veldnaam Beschrijving Voorbeeld waarden
every Numerieke waarde van de herhalingsfrequentie 10, 30, 2
period Eenheid van de herhalingsfrequentie IntervalSchedule.SECONDS, IntervalSchedule.MINUTES, IntervalSchedule.HOURS, IntervalSchedule.DAYS

4️⃣ Voorbeeld van PeriodicTask instelling met update_or_create

from django_celery_beat.models import PeriodicTask, IntervalSchedule
import json

# IntervalSchedule aanmaken (elke 10 minuten)
schedule, created = IntervalSchedule.objects.get_or_create(
    every=10,
    period=IntervalSchedule.MINUTES
)

# PeriodicTask aanmaken of updaten
task, created = PeriodicTask.objects.update_or_create(
    name="send_reminder_email",
    defaults={
        "interval": schedule,
        "task": "myapp.tasks.send_reminder_email",
        "args": json.dumps([1]),
        "enabled": True,
    }
)

5️⃣ Overige veldbeschrijvingen van PeriodicTask

Veldnaam Beschrijving Voorbeeld
name Unieke naam van de taak "send_report_task"
interval Uitvoerfrequentie (IntervalSchedule referentie) schedule
crontab Wanneer uitgevoerd moet worden op een specifiek tijdstip (CrontabSchedule referentie) None
clocked Wanneer slechts één keer moet worden uitgevoerd op een specifiek tijdstip (ClockedSchedule referentie) None
task De uit te voeren Celery-taak "myapp.tasks.send_report"
args Argumenten om naar de functie te sturen (in JSON-formaat) json.dumps([123, "email@example.com"])
kwargs Sleutelargumenten om naar de functie te sturen (in JSON-formaat) json.dumps({"priority": "high"})
enabled Of het uitgevoerd moet worden True of False
one_off Eenmalig uitvoeren en beëindigen True of False

📌 Als one_off=True is ingesteld, wordt de taak na één uitvoering gedeactiveerd, maar niet verwijderd

📌 Met het clocked veld kan je een taak inplannen die op een exact tijdstip slechts één keer uitgevoerd wordt.

🎯 Conclusie: Maak gebruik van update_or_create voor flexibele taakbeheer!

📌 Bij het registreren van geplande taken in Django-Celery-Beat, maakt update_or_create() het eenvoudig om bestaande taken te wijzigen

📌 Het PeriodicTask.interval veld verwijst naar IntervalSchedule, dus je moet eerst een IntervalSchedule instantie aanmaken en deze verbinden.

📌 Bij het beheren van complexe geplande taken kun je flexibeler instellen door velden zoals args, kwargs, enabled, one_off, clocked te gebruiken.

🔥 Vooruitblik op de volgende aflevering

In deze aflevering hebben we gezien hoe je PeriodicTask flexibeler kunt aanmaken en bewerken.

In de volgende aflevering zullen we de instellingen voor het plannen van taken op specifieke tijden met Crontab en het éénmalig uitvoeren van taken met Clocked bespreken.

Als je meer diepgaande manieren wilt leren om Celery te gebruiken, kijk dan uit naar de volgende aflevering! 🚀

En als je meer blogs over Celery wilt zien,

zoek dan in de lijst met 'Vergelijkbare berichten' hieronder of zoek naar "Celery" in de zoekbalk rechtsboven! 😊