Cómo permitir que el apio acepte parámetros personalizados
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
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.