es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

proceso de bifurcación bajo uwsgi, django

Necesito ejecutar algunas tareas lentas al recibir una solicitud POST.
Mi servidor funciona con UWSGI que se comporta de manera extraña.

Localhost (python manage.py runserver):
– al recibir una solicitud del navegador, hago p = Process(target=workload); p.start(); return redirect(...) . El navegador sigue inmediatamente la redirección y el proceso de trabajo comienza en segundo plano.

UWSGI (2 trabajadores):
– El proceso en segundo plano se inicia, pero el navegador no se redirige. Espera hasta que el hijo termine.

Nota: He agregado el parámetro close-on-exec=true (como se recomienda en la documentación y en https://stackoverflow.com/questions/17592692/running-a-subprocess-in-uwsgi-application) en la configuración de UWSGI, pero no tiene ningún efecto visible, la aplicación espera la salida del hijo.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que estás experimentando un problema con la redirección y la ejecución de tareas lentas al recibir una solicitud POST en un servidor UWSGI.

    Cuando ejecutas el servidor localmente usando python manage.py runserver, puedes iniciar un proceso en segundo plano al recibir una solicitud desde el navegador utilizando Process del módulo multiprocessing, y luego redirigir inmediatamente el navegador a una nueva página. Sin embargo, cuando ejecutas el mismo código en un servidor UWSGI con 2 workers, el proceso en segundo plano se inicia pero el navegador no se redirige. En su lugar, permanece esperando hasta que el proceso hijo finalice.

    Ya has intentado agregar close-on-exec=true a la configuración de UWSGI según lo recomendado en la documentación y en Stack Overflow, pero no resolvió el problema.

    Una posible solución podría ser utilizar una cola de tareas como Celery para manejar las tareas lentas de forma asíncrona. Esto permitiría a tu servidor responder rápidamente a la solicitud y luego enviar las tareas lentas a la cola para su procesamiento posterior. Luego, puedes hacer que Celery envíe una notificación al navegador o a una cola de mensajes cuando las tareas se hayan completado.

    Otra opción es utilizar web sockets para enviar actualizaciones al navegador en tiempo real mientras se ejecutan las tareas lentas. Esto requeriría una configuración adicional pero podría proporcionar una experiencia de usuario más interactiva.

    En general, es importante gestionar cuidadosamente las tareas lentas al manejar solicitudes web para evitar bloquear el servidor y causar tiempos de respuesta largos para los usuarios.

Comments are closed.