El enhebrado en Django no está funcionando en producción.

Tengo una función en mi Django views.py que se ve así.

def process(request): form = ProcessForm(request.POST, request.FILES) if form.is_valid(): instance = form.save(commit=False) instance.requested_by = request.user instance.save() t = threading.Thread(target=utils.background_match, args=(instance,), kwargs={}) t.setDaemon(True) t.start() return HttpResponseRedirect(reverse('mart:processing')) 

Aquí, estoy tratando de llamar a una función ‘background_match’ en un hilo separado cuando se envía ProcessForm. Dado que este hilo tarda algún tiempo en completarse, redirecciono al usuario a otra página llamada ‘mart: processing’.

El problema al que me enfrento es que todo funciona bien en mi máquina local pero no funciona en el servidor de producción, que es una instancia de AWS EC2. El hilo no comienza en absoluto. Hay un bucle for dentro de la función background_match que no avanza.

Sin embargo, si actualizo (CTRL + R) la página ‘mart: processing’, se mueve 1 o 2 iteraciones. Por lo tanto, para que se ejecute un ciclo completo de 1000 iteraciones, necesito actualizar la página 1000 veces. Si después, digamos, 100 iteraciones, no actualizo la página, se atasca en ese punto y no se mueve a la 101a iteración. ¡Por favor ayuda!

Arquitectura errónea. Django y otras aplicaciones web deberían generar hilos como este. La forma correcta es crear una tarea asíncrona utilizando una cola de tareas. La cola de tareas más popular para django pasa a ser Celery .

La página de mart:processing debe verificar el resultado asíncrono para determinar si la tarea se ha completado. Un bosquejo en bruto es el siguiente.

 from celery.result import AsynResult from myapp.tasks import my_task ... if form.is_valid(): ... task_id = my_task() request.session['task_id']=task_id return HttpResponseRedirect(reverse('mart:processing')) ... 

En la pagina siguiente

 task_id = request.session.get('task_id') if task_id: task = AsyncResult(task_id)