pyplot - subplot python
Trabajador de fondo con frasco (2)
Tengo una aplicación web desarrollada en python / Flask y tiene un trabajo en segundo plano correspondiente que se ejecuta continuamente, sondeando periódicamente los datos de cada usuario registrado.
Me gustaría que este trabajo en segundo plano comience cuando el sistema se inicie y siga funcionando hasta que se apague. En lugar de configurar las secuencias de comandos /etc/rc.d, la aplicación del matraz generó un nuevo proceso (utilizando el módulo de multiprocesamiento) cuando se inicia la aplicación.
Entonces, con esta configuración, solo tengo que implementar la aplicación Flask y eso también hará que el trabajador en segundo plano se ejecute.
¿Cuáles son los inconvenientes de esto? ¿Es esto un truco completo y completo que es frágil de alguna manera o una buena forma de configurar una aplicación web con la correspondiente tarea de fondo?
La desventaja de su enfoque es que hay muchas maneras en que podría fallar, especialmente al detener y reiniciar su aplicación de matraz.
- Tendrá que lidiar con un apagado elegante para darle a su trabajador la oportunidad de terminar su tarea actual.
- En algún momento, su trabajador no se detendrá a tiempo y podría demorarse mientras usted inicia otro cuando reinicia su aplicación de matraz.
Aquí hay algunos enfoques que sugeriría dependiendo de sus limitaciones:
script + crontab
Solo tiene que escribir un script que haga la tarea que desee y cron
se encargará de ejecutarlo cada pocos minutos. Ventajas : cron
lo ejecutará periódicamente y se iniciará cuando el sistema se inicie. Desventajas : si la tarea lleva demasiado tiempo, es posible que tenga varias instancias de su secuencia de comandos ejecutándose al mismo tiempo. here puede encontrar algunas soluciones para este problema.
supervisor
supervisord
es una forma ordenada de tratar con diferentes daemons. Puede configurarlo para ejecutar su aplicación, su script de fondo o both y hacer que comiencen con el servidor. El único inconveniente es que debe instalar supervisord
y asegurarse de que su daemon se está ejecutando cuando se inicia el servidor.
uwsgi
uwsgi
es una forma muy común de desplegar aplicaciones de matraz. Tiene algunas features que pueden ser útiles para la gestión de trabajadores en segundo plano.
Apio
Celery es una cola de tareas asíncrona / cola de trabajos basada en el envío de mensajes distribuidos. Se centra en el funcionamiento en tiempo real, pero también admite la programación. Creo que esta es la mejor solución para programar tareas en segundo plano para una aplicación de matraz o cualquier otra aplicación basada en Python. Pero usarlo viene con un poco de volumen extra. Introducirá al menos los siguientes procesos: - un intermediario (rabbitmq o redis) - un trabajador - un programador
También puede obtener supervisord
para administrar todos los procesos anteriores y hacer que comiencen cuando se inicie el servidor.
Conclusión
En su búsqueda de reducir el número de procesos, yo sugeriría mucho la solución basada en crontab
, ya que puede llevarlo muy lejos. Pero asegúrese de que su script de fondo deje un seguimiento de ejecución o registros de algún tipo.
Prueba el flask-celery . Es un marco para ejecutar tareas diferidas, secundarias o distribuidas. Sin embargo, necesita una aplicación de broker: generalmente se usa RabbitMQ, pero puede usar una base de datos que ya tenga, consulte los documentos del proyecto Celery .
Usarlo es tan simple como esto: crear el módulo de trabajadores
from celery.tasks import task
@task
def add(x, y):
return x + y
Configurar:
# celeryconfig.py
# (for RabbitMQ)
CELERY_RESULT_BACKEND = "amqp"
CELERY_IMPORTS = ("tasks", )
Ejecute el proceso de fondo:
$ celeryd -l info -I tasks,handlers
Métodos de demora de llamadas:
>>> from tasks import add
>>> add.delay(4, 4)
<AsyncResult: 889143a6-39a2-4e52-837b-d80d33efb22d>