¿Cuál es la forma más elegante de comenzar con celeryd en un proyecto de Django?

Estoy empezando con Celery en mi proyecto de Django y no pude evitar preguntarme: ¿cuál es la forma más elegante de empezar a trabajar con Celery para un proyecto?

Permítanme explicar el razonamiento de esta pregunta.

Actualmente, la forma recomendada de comenzar el apio parece ser python manage.py celeryd en configuraciones más simples y algo a lo largo de las líneas de /etc/init.d/celeryd start en otras más complejas. Sin embargo, en el primer caso, este proceso se siente frágil ya que no se iniciaría automáticamente, mientras que el segundo requiere bastante configuración específica del proyecto (virtualenv, settings etc.) Especialmente esto último demuestra mi sentimiento general de que un trabajador de Celery es algo profundamente ligado al código base del que forma parte y también está profundamente ligado al proceso principal del proyecto, ya que un trabajador de Celery sin algo para crear tareas en él es prácticamente inútil. (con una excepción que es celerybeat). Otro problema con init.d scripts es que necesitarían una lógica avanzada para manejar varios proyectos por servidor (con entornos virtuales separados, configuraciones, rutas, etc.)

Entonces pensé, podría ser una configuración bastante elegante para comenzar celeryd junto con mi proceso principal, por ejemplo, generarlo desde mod_wsgi dentro de Apache (similar para otras opciones de configuración) y así eliminarlo cuando el proceso principal falla (/etc/init.d/apache2 stop). Sin embargo, no estoy muy seguro de si hay trampas técnicas que consideren el rendimiento y/o la seguridad en este razonamiento; bien podría ser el caso, ya que intenté buscar en Google y no encontré prácticamente nada.

  1. ¿Mi razonamiento es defectuoso considerando la arquitectura Celery?
  2. ¿Puedo de alguna manera engendrar un celeryd desde algún lugar dentro mod_wsgi y es sensato?
  3. ¿Cómo inician los trabajadores de Celery en sus proyectos?

preguntado el 10 de marzo de 12 a las 14:03

Echa un vistazo a supervisor para la gestión de procesos. En mi servidor, administro nginx,gunicorn/uwsgi, postgres y numerosos proyectos django usándolo. También podría ser una buena manera de comenzar y detener el apio:

1 Respuestas

Empiezo a utilizar celery con manage.py celeryd y lo manejo con supervisor. En cada implementación que modifica una tarea, simplemente reinicio apio después de implementar y reiniciar apache.\

Edit:

Usamos chef para administrar nuestras configuraciones para el supervisor y otros procesos, por lo que esto podría ser un poco excesivo. Tenemos un maestro supervisord.conf que incluye un archivo de configuración separado para cada sitio que ejecutamos. Uno de esos podría verse así:

[program:celery_newproject]
command = /srv/www/.virtualenvs/newprojectenv/bin/python /srv/www/projects/newproject/manage.py celeryd --concurrency=2 --settings=settings.alpha --pidfile=/var/run/celery/celery_newproject.pid
user = wsgiuser
environment = PYTHON_EGG_CACHE="/tmp/.python-eggs"

En la implementación, simplemente ejecutamos

sudo supervisorctl restart celery_newproject

Esto reinicia el proceso de supervisor para el apio y recoge cualquier tarea nueva que haya definido.

También hay otras formas no elegantes de hacer esto. En mis sitios personales, solo tengo un trabajo cron en ejecución que verifica la existencia del archivo .pid y reinicia el apio si no existe. No es nada elegante, pero funciona para sitios de baja confiabilidad.

Respondido el 26 de diciembre de 12 a las 14:12

Tal vez usted podría proporcionar una supervisord configuración de ejemplo? Tu respuesta es un poco delgada. - Martijn Pieters

Bienvenido a P.SE: para hacer eco de Martijn, amplíe su respuesta para explicarlo más detalladamente. - Andrés

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.