Red de conocimiento informático - Conocimiento informático - Cómo permitir que el apio acepte parámetros personalizados

Cómo permitir que el apio acepte parámetros personalizados

Muchas aplicaciones Django necesitan realizar tareas asincrónicas para que la ejecución de las solicitudes http no se retrase. Hay muchas maneras de hacer esto, y usar Celery es una buena opción porque Celery

tiene un montón de soporte comunitario, una escalabilidad perfecta y funciona bien con Django. El apio se puede utilizar no sólo en Django, sino también en muchos otros lugares. Entonces, una vez que aprenda a usar Celery, podrá usarlo fácilmente en otros proyectos.

1.Versión de Apio

Esta publicación de blog se centra en Apio 3.0.x.

2. Introducción a Celery

El objetivo principal de Celery es ejecutar tareas asincrónicas y puedes optar por retrasar o programar la ejecución. ¿Por qué necesitamos realizar tareas asincrónicas?

Primero, supongamos que el usuario está realizando una solicitud y esperando a que se complete y regrese. En la función de visualización después de esta solicitud, es posible que necesitemos realizar una tarea de programación de larga duración, que puede tardar mucho más de lo que el usuario puede tolerar. Cuando no es necesario realizar la tarea de inmediato, podemos usar Celery para realizar la tarea en segundo plano sin interrumpir la navegación web del usuario. Cuando una tarea requiere acceso a un servidor remoto para completarse

a menudo es imposible determinar cuánto tiempo llevará.

La segunda situación es realizar determinadas tareas con regularidad. Por ejemplo, necesitamos comprobar el pronóstico del tiempo cada hora y almacenar los datos en una base de datos. Podemos escribir esta tarea y hacer que Celery la ejecute cada hora. De esta manera, nuestra

aplicación web puede obtener la última previsión meteorológica.

La tarea que estamos discutiendo aquí es una función de Python. La ejecución periódica de tareas puede verse como la ejecución de una función retrasada. Podemos usar Celery para llamar a la función task1 con un retraso de 5 minutos, pasando los argumentos (1, 2, 3).

Preferimos colocar Celery dentro del proyecto para que las tareas tengan acceso a una base de datos unificada y a la configuración de Django.

Cuando una tarea está lista para ejecutarse, Celery la pone en cola. La cola almacena una lista de tareas ejecutables. Podemos usar varias colas, pero por simplicidad solo usaremos una.

Poner tareas en una cola es como agregarlas a una lista de tareas pendientes. Para que la tarea se ejecute, también necesitamos un trabajador ejecutándose en otro hilo. El Trabajador observa la ejecución de las tareas en tiempo real y las ejecuta una por una.

Puedes utilizar varios Workers, normalmente en diferentes servidores.

Discutiremos las colas, los trabajadores y otro proceso muy importante más adelante, así que comencemos:

3. Instalar Celery

Podemos usar pip para instalar Celery. en vietualenv:

pip install django-celery

4. Configuración de Django

Ahora usaremos django runserver para iniciar Celery. Para el broker Celery usaremos el broker de base de datos Django, ahora todo lo que necesitamos saber es que Celery

requiere un broker y podemos usar el propio Django como broker. (Pero al implementar, preferimos usar un proxy más estable y eficiente, como Redis.

)

En settings.py:

importar djcelery p>importar djcelery

djcelery.setup_loader()

BROKER_URL = 'django : //'

...

INSTALLED_APPS = (

...

'djcelery',

'kombu.transport.django',

...

)

Los dos primeros elementos son obligatorios, el tercero le dice a Celery que use Django proyecto como agente.

Es necesario agregar djcelery en INSTALLED_APPS. django es un proxy basado en Django

Finalmente, cree las tablas de datos requeridas por Celery. Si usa South como herramienta de migración de datos, ejecute:

python enable.py migrar<. /p>

De lo contrario, ejecute: (ya sea Django 1.6 o Django 1.7)

python enable.py syncdb

5. Crear tareas

Como se mencionó. arriba, la tarea es una función de Python. Pero Celery necesita saber que la función es una tarea, por lo que podemos usar el decorador propio de Celery: @task. Cree tarease.py en el directorio de la aplicación django:

de la tarea de importación de apio

@task()

def add(x, y):

return x y

Cuando está en settings.py Cuando ejecuta djcelery.setup_loader(), Apio mira todas las tareas. py, busque la función marcada como tarea y

desde la tarea de importación de apio

desde la tarea de importación de apio

@task()

de la tarea de importación de apio

de la tarea de importación de apio

@task()

Regístrelas como tareas de apio.

Marcar funciones como tareas no impide que se ejecuten normalmente. Aún puedes llamar como de costumbre: z = add(1, 2).

6. Realizar tareas

Empecemos con un ejemplo sencillo. Supongamos que queremos ejecutar la tarea de forma asincrónica después de que el usuario realiza una solicitud y devolver la respuesta inmediatamente, de modo que la solicitud no se bloquee y el proceso de acceso del usuario sea fluido. Por lo tanto, podemos usar .delay, por ejemplo en vistas en views.py:

from myapp.tasks import add

...

add. (2, 2)

...

Apio agrega la tarea a la cola y regresa inmediatamente. Cuando el trabajador ve la tarea, la ejecuta y la elimina de la cola.

El trabajador ejecutará el siguiente código:

import myapp.tasks.add

myapp.tasks.add(2, 2)

7. p >

Lo que hay que tener en cuenta aquí es que se debe mantener la coherencia al importar tareas. .Porque al ejecutar djcelery.setup_loader(), las tareas quedan registradas en el nombre de la aplicación,

plus.tasks.function_name en INSTALLED_APPS, si usamos diferentes referencias debido a diferentes rutas de Python (por ejemplo, importar desde myproject.myapp.tasks

add) en task.py, Celery no sabrá que se trata de la misma tarea y puede provocar errores extraños.

8. Prueba

a. Iniciar Worker

Como se mencionó anteriormente, necesitamos iniciar Worker en el entorno de desarrollo:

Primero. Inicie la terminal tal como inició el proyecto Django, active virtualenv y cambie al directorio del proyecto Django. Luego inicie el servidor web de Django: python Manage.py RunServer.

Luego inicie el Trabajador:

python managers.py apio trabajador ---logvel=info

En este punto, el Trabajador se ejecutará en la terminal y mostrar la salida.

b. Inicie la tarea

Abra una nueva terminal, active virtualenv y cambie al directorio del proyecto django:

$ python managers.py shell

p>

gt;gt;gt; from myapp.tasks import add

gt;gt;gt; add.delay(2, 2)

En este punto, Puede Puede ver en la ventana que el Trabajador está ejecutando la tarea:

[2014-10-07 08:47:08,076: INFO/MainProcess] Obtener la tarea del agente: myapp.tasks.add [e080e047-b2a2-43a7 -af74-d7d9d98b02fc]

[2014-10-07 08:47:08,299: INFO/MainProcess] Tarea myapp.tasks.add[e080e047-b2a2-43a7-af74-d7d9d98b02fc ] en 0.183349132538s Éxito interno: 4

9. Otro ejemplo

Veamos un ejemplo más realista en views.py y task.py.

clean_data

# Programar tareas para procesar datos más tarde

do_something_with_form_ data.delay(data)

return render_too_response(...)

# task.py

@task

def do_something_with_form_data(data):

call_slow_web_service(data['usuario'], datos['texto'], . .. )

10. Depuración

Dado que Celery se ejecuta iniciando múltiples componentes, podemos perder uno o dos componentes. Por lo tanto, recomendamos:

Usar la configuración más simple

Usar las funciones de depuración y registro de Python para mostrar el proceso actual

11. Modo ansioso

Si configura en settings.py:

CELERY_ALWAYS_EAGER = True

Entonces Celery se ejecutará en modo ansioso y la tarea se ejecutará sin demora:

# Si El modo ansioso está habilitado, las siguientes dos líneas de código serán las mismas

add.delay(2, 2)

add(2, 2)

12. Verificar cola

Debido a que estamos usando django como proxy, la cola se almacena en la base de datos de django. Esto significa que podemos ver la cola a través de django admin:

# admin.py

de django.contrib import admin

de kombu.transport.django import models como kombu_models

admin.site.register(kombu_models.Message)

13. Verifique los resultados

Cada vez que se ejecuta una tarea asincrónica, Celery devolverá un Objeto AsyncResult Como resultado. Puede guardarlo y comprobar en el futuro si la tarea se ejecutó correctamente y devolvió el resultado:

# views.py

resultado = add.delay(2, 2)

...

if result.ready():

print "La tarea se ha ejecutado"

if result.successful():

print "El resultado fue: s" resultado.resultado

else:<

if isinstance(result.result, Exception):

imprimir "La tarea falló debido a que se generó una excepción"

elevar resultado.resultado

else:

imprimir "La tarea falló sin generar una excepción"

else:

print "La tarea aún no se ha ejecutado"

14. Tareas periódicas

También existe un modo común para que Celery ejecute tareas periódicas. .

Al ejecutar tareas periódicas, Celery las ejecuta mediante el proceso celerybeat. Celerybeat se ejecutará continuamente y cuando sea necesario ejecutar una tarea periódica

Celerybeat la agregará a la cola. A diferencia de los procesos de trabajo, Celerybeat solo requiere un proceso de trabajo.

Iniciar Celerybeat:

python enable.py celery beat

Hay muchas formas de permitir que Celery ejecute tareas periódicas, pero veamos primero la primera. es decir, almacenar tareas periódicas en la base de datos de Django. De esta manera, podemos modificar fácilmente la tarea incluso si se están ejecutando django y Celery. Solo necesitamos configurarlo en settings.py para habilitar esta característica:

# settings.py

CELERYBEAT_SCHEDULER = 'djcelery.schedulers.