¿Puedo ejecutar algún código constantemente dentro de Django como un demonio?

Estoy usando mod_wsgi para servir un sitio de django a través de Apache. También tengo un código Python que se ejecuta como un proceso en segundo plano (¿dameon?). Sigue sondeando un servidor e inserta datos en uno de los modelos de Django. Esto funciona bien, pero ¿puedo hacer que este código sea parte de mi aplicación Django y pueda ejecutarse constantemente en segundo plano? No necesita ser un proceso per se, sino un arte del sitio de Django que está activo constantemente. Si es así, ¿podría indicarme un ejemplo o alguna documentación que me ayude a lograr esto?

Gracias.

Puede configurar un trabajo cron que ejecute alguna función que haya definido, o, el método más avanzado y probablemente recomendado, integrar apio en su proyecto (que en realidad es bastante fácil).

Puede crear un subproceso en segundo plano desde el script WSGI cuando se importa por primera vez.

import threading import time def do_stuff(): time.sleep(60) ... do periodic job _thread = threading.Thread(target=do_stuff) _thread.setDaemon(True) _thread.start() 

Para que esto funcione, tendría que estar usando solo un proceso de daemon, de lo contrario cada proceso estaría haciendo lo mismo que probablemente no desea.

Si está utilizando varios procesos en el grupo de procesos de daemon, una alternativa es crear un grupo de procesos de daemon especial cuyo único propósito sea ejecutar este subproceso en segundo plano. En otras palabras, el proceso no recibe ninguna solicitud.

Puedes hacer esto teniendo:

 WSGIDaemonProcess django-jobs processes=1 threads=1 WSGIImportScript /usr/local/django/mysite/apache/django.wsgi \ process-group=django-jobs application-group=%{GLOBAL} 

La directiva WSGIImportScript dice que se cargue ese script y se ejecute en el inicio en el contexto del grupo de proceso ‘django-jobs’.

Para guardar tener varios scripts, lo he señalado a lo que sería su archivo de script WSGI original que utilizó para WSGIScriptAlias. Sin embargo, no queremos que se ejecute cuando se carga con esa directiva, por lo que hacemos:

 import mod_wsgi if mod_wsgi.process_group == 'django-jobs': _thread = threading.Thread(target=do_stuff) _thread.setDaemon(True) _thread.start() 

Aquí se ve el nombre del grupo de proceso de daemon y solo se ejecuta cuando se inicia dentro del grupo de proceso de daemon especial configurado con un solo proceso solo para esto.

En general, solo está usando Apache como un gran administrador de procesos glorificado, aunque ya se sabe que es robusto. Es un poco excesivo, ya que este proceso consumirá memoria adicional además de las solicitudes de aceptación y manejo, pero dependiendo de la complejidad de lo que esté haciendo puede ser útil.

Un aspecto lindo de hacer esto es que, dado que todavía es una aplicación completa de Django, podría asignar direcciones URL específicas a este proceso y proporcionar una API remota para administrar o monitorear la tarea en segundo plano y lo que está haciendo.

 WSGIDaemonProcess django-jobs processes=1 threads=1 WSGIImportScript /usr/local/django/mysite/apache/django.wsgi \ process-group=django-jobs application-group=%{GLOBAL} WSGIDaemonProcess django-site processes=4 threads=5 WSGIScriptAlias / /usr/local/django/mysite/apache/django.wsgi WSGIProcessGroup django-site WSGIApplicationGroup %{GLOBAL}  WSGIProcessGroup django-jobs  

Aquí, todas las URL, excepto las que se encuentran bajo / admin, se ejecutan en ‘django-site’, con / admin en ‘django-jobs’.

De todos modos, eso aborda la pregunta específica de hacerlo dentro del proceso del demonio mod_wsgi de Apache según se solicitó.

Como se señaló, la alternativa es tener un script de línea de comandos que configure y cargue Django y haga el trabajo y lo ejecute desde un trabajo cron. Una secuencia de comandos de línea de comandos significa un uso ocasional de memoria transitoria, pero el costo de inicio para el trabajo es mayor, ya que es necesario cargar todo cada vez.

Anteriormente utilicé un trabajo cron, pero te digo que cambiarás al apio después de un tiempo.

El apio es el camino a seguir. Además, puede realizar un largo proceso asíncrono para que pueda acelerar el tiempo de solicitud / respuesta.