Frasco largo rutinas

Tengo que hacer un trabajo largo en mi aplicación Flask. Y quiero hacerlo asíncrono. Simplemente comienza a trabajar y luego comprueba el estado desde javascript.

Estoy tratando de hacer algo como:

@app.route('/sync') def sync(): p = Process(target=routine, args=('abc',)) p.start() return "Working..." 

Pero esto crea a los trabajadores gunicornios extintos.

¿Cómo se puede resolver? ¿Debo usar algo como el apio?

    Hay muchas opciones. Puedes desarrollar tu propia solución, usar Celery o Twisted (estoy seguro de que hay más opciones ya hechas, pero esas son las más comunes).

    Desarrollar su solución interna no es difícil. Puede usar el módulo de multiprocessing de la biblioteca estándar de Python:

    • Cuando llega una tarea, inserta una fila en su base de datos con el ID de tarea y el estado.
    • A continuación, inicie un proceso para realizar el trabajo que actualiza el estado de la fila al finalizar.
    • Puede tener una vista para verificar si la tarea ha finalizado, lo que en realidad solo verifica el estado en el correspondiente.

    Por supuesto, debe pensar dónde desea almacenar el resultado del cálculo y lo que sucede con los errores.

    Ir con apio también es fácil. Se vería como la siguiente. Para definir una función para ser ejecutada de forma asíncrona:

     @celery.task def mytask(data): ... do a lot of work ... 

    Luego, en lugar de llamar la tarea directamente, como mytask(data) , que la ejecutaría de inmediato, use el método de delay :

     result = mytask.delay(mydata) 

    Finalmente, puedes verificar si el resultado está disponible o no con ready :

     result.ready() 

    Sin embargo, recuerde que para usar Celery debe ejecutar un proceso de trabajo externo.

    Nunca he echado un vistazo a Twisted, así que no puedo decirte si es más o menos complejo que esto (pero debería estar bien hacer lo que quieras hacer también).

    En cualquier caso, cualquiera de esas soluciones debería funcionar bien con Flask. Para verificar el resultado, no importa si usas Javascript. Simplemente haga la vista que comprueba el estado de retorno JSON (puede usar jsonify de jsonify ).

    Yo usaría un intermediario de mensajes como rabbitmq o activemq. El proceso del flask agregaría trabajos a la cola de mensajes y un proceso de trabajo de larga ejecución (o grupo o procesos de trabajo) quitaría los trabajos de la cola para completarlos. El proceso de trabajo podría actualizar una base de datos para permitir que el servidor del matraz conozca el estado actual del trabajo y pase esta información a los clientes.

    Usar apio parece ser una buena manera de hacer esto.