Django
Async-uppgifter (selleri)
Sök…
Anmärkningar
Selleri är en uppgiftskö som kan köra bakgrund eller schemalagda jobb och integreras med Django ganska bra. Selleri kräver något som kallas meddelandemäklare för att skicka meddelanden från kallelse till arbetarna. Den här meddelandemäklaren kan vara redis, rabbitmq eller till och med Django ORM / db även om det inte är ett rekommenderat tillvägagångssätt.
Innan du börjar med exemplet måste du konfigurera selleri. För att konfigurera selleri, skapa en celery_config.py
fil i huvudappen, parallellt med filen 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)
Och i __init__.py
fil importera selleri-appen. så här
# -*- coding: utf-8 -*-
# Not required for Python 3.
from __future__ import absolute_import
from .celery_config import app as celery_app # noqa
För att köra selleriarbetare använder du det här kommandot på den nivå där manage.py är.
# pros is your django project,
celery -A proj worker -l info
Enkelt exempel för att lägga till två nummer
För att starta:
- Installera selleri
pip install celery
- konfigurera selleri (gå till kommentarsektionen)
from __future__ import absolute_import, unicode_literals
from celery.decorators import task
@task
def add_number(x, y):
return x + y
Du kan köra detta asynkront med .delay()
.
add_number.delay(5, 10)
, där 5 och 10 är argumenten för funktionen add_number
För att kontrollera om async-funktionen har slutfört operationen kan du använda .ready()
på async-objektet som returneras av delay
.
För att hämta resultatet av beräkningen kan du använda .result
på async-objektet.
Exempel
async_result_object = add_number.delay(5, 10)
if async_result_object.ready():
print(async_result_object.result)