Django
Async-taken (selderij)
Zoeken…
Opmerkingen
Selderij is een takenwachtrij die achtergrond- of geplande taken kan uitvoeren en die vrij goed met Django kan worden geïntegreerd. Selderij vereist iets dat bekend staat als berichtenmakelaar om berichten van aanroeping door te geven aan de werknemers. Deze berichtenmakelaar kan redis, rabbitmq of zelfs Django ORM / db zijn, hoewel dat geen aanbevolen aanpak is.
Voordat u aan het voorbeeld begint, moet u selderij configureren. Om selderij te configureren, maakt u een bestand celery_config.py
in de hoofdapp, parallel aan het bestand settings.py
.
from __future__ import absolute_import
import os
from celery import Celery
from django.conf import settings
# broker url
BROKER_URL = 'redis://localhost:6379/0'
# Indicate Celery to use the default Django settings module
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')
app = Celery('config')
app.config_from_object('django.conf:settings')
# if you do not need to keep track of results, this can be turned off
app.conf.update(
CELERY_RESULT_BACKEND=BROKER_URL,
)
# This line will tell Celery to autodiscover all your tasks.py that are in your app folders
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
En importeer in het __init__.py
bestand van de __init__.py
de selderie-app. soortgelijk
# -*- coding: utf-8 -*-
# Not required for Python 3.
from __future__ import absolute_import
from .celery_config import app as celery_app # noqa
Om de bleekselderij uit te voeren, gebruikt u deze opdracht op het niveau waar manage.py is.
# pros is your django project,
celery -A proj worker -l info
Eenvoudig voorbeeld om 2 nummers toe te voegen
Starten:
- Installeer selderij
pip install celery
- selderij configureren (ga naar het gedeelte met opmerkingen)
from __future__ import absolute_import, unicode_literals
from celery.decorators import task
@task
def add_number(x, y):
return x + y
U kunt dit asynchroon uitvoeren met de methode .delay()
.
add_number.delay(5, 10)
, waarbij 5 en 10 de argumenten zijn voor de functie add_number
Als u wilt controleren of de functie async de bewerking heeft voltooid, kunt u de functie .ready()
op het async-object dat wordt geretourneerd door de delay
.
Om het resultaat van de berekening op te halen, kunt u het kenmerk .result
op het async-object.
Voorbeeld
async_result_object = add_number.delay(5, 10)
if async_result_object.ready():
print(async_result_object.result)