Pregunta

Implementé un chat, usando Ajax Long Polling y Gevent. Para leer, el cliente AJAX la vista de actualización y espere con gevent.event.wait para obtener una actualización.

Problema: La transacción PostgreSQL abierta por Django al comienzo de una solicitud (para obtener información de sesión) no está cerrada hasta el final de la solicitud. Y esas transacciones inactivas toman mucha memoria.

¿Cuál sería la forma más limpia de cerrar la transacción PostgreSQL sin cerrar la solicitud? Actualmente estoy enviando la señal request_finished manualmente, pero se siente como un truco.

¿Fue útil?

Solución

La forma en que lo está haciendo es probablemente la mejor manera en el marco de su hack de todos modos. ¿Hay alguna razón por la que está tratando de calzar la cola larga en el proceso de solicitud-respuesta en lugar de usar algo como django-socketio?

Otros consejos

Mira aquí: https://docs.djangoproject.com/en/dev/topics/db/transactions/#django.db.transaction.commit_manualmente

@transaction.commit_manually
def yourview(request):
    # do your db actions
    transaction.commit()

O si prefiere los gerentes de contexto:

def yourview(request):
    ...
    with transaction.commit_manually():
         # do your db actions
    ...

Además, si tiene problemas de memoria que mantienen las conexiones PostgreSQL abiertas, debe buscar una solución de agrupación utilizando PGBouncer o los diversos grupos de conexión de Gevent que existen. Debería ver algunas ganancias de rendimiento considerables al hacer esto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top