Buscar..


Observaciones

El apio es una cola de tareas que puede ejecutar trabajos en segundo plano o programados y se integra bastante bien con Django. El apio requiere algo conocido como intermediario de mensajes para pasar mensajes de invocación a los trabajadores. Este intermediario de mensajes puede ser redis, rabbitmq o incluso Django ORM / db, aunque no es un enfoque recomendado.

Antes de comenzar con el ejemplo, deberá configurar el apio. Para configurar el apio, cree un archivo celery_config.py en la aplicación principal, paralelo al archivo 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)

Y en el archivo __init__.py la aplicación principal, importe la aplicación de apio. Me gusta esto

# -*- coding: utf-8 -*- 
# Not required for Python 3. 
from __future__ import absolute_import

from .celery_config import app as celery_app  # noqa

Para ejecutar el trabajo de apio, use este comando en el nivel donde se encuentra manage.py.

# pros is your django project, 
celery -A proj worker -l info

Ejemplo simple para sumar 2 números.

Para empezar:

  1. Instalar apio pip install celery
  2. configurar apio (diríjase a la sección de comentarios)
from __future__ import absolute_import, unicode_literals

from celery.decorators import task


@task
def add_number(x, y):
    return x + y

Puede ejecutar esto de forma asincrónica utilizando el método .delay() .

add_number.delay(5, 10) , donde 5 y 10 son los argumentos para la función add_number

Para verificar si la función asíncrona ha finalizado la operación, puede usar la función .ready() en el objeto asíncrono devuelto por el método de delay .

Para obtener el resultado del cálculo, puede usar el atributo .result en el objeto asíncrono.

Ejemplo

async_result_object = add_number.delay(5, 10)
if async_result_object.ready():
    print(async_result_object.result)


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow