Django Academy · Lektion

Skrivning og kald af @shared_task

Kør funktioner asynkront med delay()

Lektion 3 af 413 trin

Skrivning og kald af @shared_task er en gratis Django Academy-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Django Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Django Academy-kurset indeholder 4 lektioner i alt.

Opgaver er bare funktioner

En Celery-opgave er en almindelig Python-funktion med en decorator øverst. Decoratoren lærer Celery, hvordan opgaven skal lægges i kø og køres senere.

Hvorfor shared_task

Brug @shared_task i stedet for @app.task, så dine opgaver ikke afhænger af en bestemt Celery-app. Det er standardvalget i Django-apps.

Skriv din første opgave

Placér opgaver i en tasks.py inde i en app. Dekorér en almindelig funktion, så finder Celery den via autodiscover.

from celery import shared_task

@shared_task
def add(x, y):
    return x + y

Kald den med delay

Hvis du vil køre en opgave i baggrunden, skal du kalde .delay() i stedet for at kalde funktionen direkte. Det lægger jobbet i kø og returnerer med det samme.

add.delay(2, 3)  # queued, runs on a worker

delay sammenlignet med direkte kald

Et kald til add(2, 3) kører med det samme i din webproces. Et kald til add.delay(2, 3) sender det til køen. Samme funktion, men meget forskellig timing.

Send enkle argumenter

Argumenter serialiseres til JSON og sendes til broker'en, så send enkle værdier som ID'er og strenge i stedet for hele model-objekter.

send_email.delay(user.id)   # good
send_email.delay(user)      # avoid: not serializable

AsyncResult-håndtaget

delay() returnerer en AsyncResult. Du kan gemme dens id og senere kontrollere status eller hente returværdien fra resultatbackend'en.

result = add.delay(2, 3)
print(result.id)

Mere kontrol med apply_async

Har du brug for en nedtælling eller en bestemt kø? Brug apply_async(), den mere omfattende version af delay med ekstra indstillinger.

add.apply_async((2, 3), countdown=10)  # run after 10s

Prøv igen ved fejl

Bind en opgave, og kald self.retry() for at køre den igen efter en fejl. Det er ideelt til ustabile netværkskald, som måske lykkes næste gang.

@shared_task(bind=True, max_retries=3)
def fetch(self):
    try:
        call_api()
    except Exception as e:
        raise self.retry(exc=e)

Idempotente opgaver vinder

Da opgaver kan blive kørt igen, bør du gøre dem idempotente: Det skal være sikkert at køre dem to gange, uden at der bliver trukket dobbelt eller sendt dobbelt. 🔁

Hold øje med arbejderloggen

Når du kalder delay, skal du holde øje med arbejderens terminal. Du kan se, at opgaven er modtaget, og se dens resultat. Det er den hurtigste måde at fejlfinde på. 👀

Hurtigt tjek

Hvordan kører du en Celery-opgave i baggrunden?

Opsummering: Skrivning af opgaver

Dekorér en funktion med @shared_task, kald den med .delay() for at placere den i kø, send simple id'er, og design opgaverne, så de kan prøves igen på en sikker måde. 🎯

Gratis at komme i gang

Lær Python med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
30
Lektioner
120

Ofte stillede spørgsmål

Er lektionen “Skrivning og kald af @shared_task” gratis?

Ja — alle 3 lektioner i læringssporet Django Academy, inklusive “Skrivning og kald af @shared_task”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Django Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Skrivning og kald af @shared_task”?

Kør funktioner asynkront med delay() Du øver dig i Django Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Django Academy?

Der kræves ingen tidligere erfaring. Django Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.

Hvor lang tid tager lektionen “Skrivning og kald af @shared_task”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Django Academy-lektion?

Ja. Alle Django Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Hvorfor baggrundsopgaver er nødvendige
  2. Opsætning af Celery med en broker
  3. Skrivning og kald af @shared_task
  4. Planlagte jobs med Celery Beat
← Tilbage til Django Academy