Después de unos días de trabajo en mi entorno de desarrollo ha llegado el momento de poner la última versión de la aplicación que estoy haciendo a producción. Como el entorno de producción tiene una configuración distinta que la del entorno de desarrollo, aquí han empezado a aparecer los problemas.
Lo primero es que tenemos una cosa ahí enmedio que se llama uwsgi y es quien ejecuta el código, en lugar del python manage.py runserver. Una de las cosas que me he encontrado es que el trozo de código que comprueba que hay tareas ejecutándose en Celery, no funciona correctamente. En mi caso estaba usando
import time, json _stats = os.popen('celery inspect stats --json').read() time.sleep(1) _stats = json.loads(_stats)
No funcionaba correctamente. He tenido que quebrarme un poco la cabeza para inspeccionar que es lo que estaba ocurriendo, por suerte existe una librería que se llama remote_pdb
(venv) root@app-dev:/var/www/html/app# pip3 install remote-pdb
Y añadimos lo siguiente en el trozo de código que queramos inspeccionar que esté corriendo a través de uwsgi
from remote_pdb import RemotePdb RemotePdb('127.0.0.1', 4444).set_trace()
Y nos connectaremos al trace por telnet
root@digitplan-dev:~# telnet localhost 4444 Trying ::1... Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. > /var/www/html/app/web/rrd.py(465)check_task_status() -> """ (Pdb)
A partir de aquí he podido comprobar que algo le pasa a celery, ya que cualquier comando que ejecutase con celery devolvía vacío. No me ha quedado otra que realizar esta comprobación de otra forma
from celery import Celery _app = Celery("nombreapp") _running_tasks = _app.control.inspect().active()['celery@' + str(hostname)] _status = len(_running_tasks) if _status == 0 and run == 1: # start the task again if it is ask to run _status = tasks.rrd_collect_system.delay()
Más información sobre Celery.control.