Tengo una aplicación django que realiza algunos cálculos en el servidor que pueden demorar hasta 30 segundos. Estoy tratando de usar canales Django para crear un indicador de progreso.
Mi configuración se basa en este tutorial: https://realpython.com/blog/python/getting-started-with-django-channels/
Todo está funcionando como se esperaba hasta ahora. Envío una tarea por web socket. Esto lo recibe mi consumidor, que llama a otros métodos para completar la tarea y luego devuelve el resultado por websocket.
Sin embargo, cuando trato de enviar varios mensajes del mismo consumidor, todos los mensajes llegan juntos al final, en lugar de llegar cuando se envían.
Aquí está mi código de consumidor:
@channel_session def ws_receive(message): data = json.loads(message['text']) reply_channel = message.reply_channel.name Channel(reply_channel).send({ "text": json.dumps({'progress': 'Starting Work'}) }) # calls outside method to do work result = perform_calculations(data, reply_channel) Channel(reply_channel).send({ "text": json.dumps({'progress': 'Finished Work','result':result }) })En este ejemplo, mi front-end recibe los mensajes de 'Trabajo inicial' y 'Trabajo terminado' al mismo tiempo, a pesar de que hay una brecha de 30 segundos entre ellos que se generan.
¿Hay alguna manera de hacer que estos mensajes lleguen en tiempo real?
Sí, lo hay, podría usar el parámetro inmediatamente.
Channel(message.reply_channel).send({ "text": json.dumps({'progress': 'Starting Work'}) }, immediately=True)También mencionado en:
¿Cómo me aseguro de que un mensaje de Django Channels se envíe inmediatamente sin demora?
Puedes echarle un vistazo a este proyecto:
https://gitlab.com/Baurin_lg/demo_channels_rest
Es una demostración para usar Django Rest y Django Channels.