Question

Je mis en œuvre une discussion, en utilisant ajax à long sondages et Gevent. Pour lire, le client ajax la vue de mise à jour et attendre avec Gevent.event.wait pour une mise à jour.

Problème: La transaction Postgresql ouverte par Django au début d'une demande (pour obtenir des informations de session) n'est pas fermée jusqu'à la fin de la demande. Et ces transactions inactives prennent beaucoup de mémoire.

Quelle serait la propre façon de fermer la transaction Postgresql sans fermer la demande? J'envoie actuellement le signal request_finished manuellement mais il se sent comme un hack.

Était-ce utile?

La solution

La façon dont vous le faites est probablement la meilleure façon dans le cadre de votre hack de toute façon. Y at-il une raison quelconque vous essayez de chausse-pied à long sondage dans le processus de réponse à la demande au lieu d'utiliser quelque chose comme django-socketio ?

Autres conseils

Voir ici: https: // docs.djangoproject.com/en/dev/topics/db/transactions/#django.db.transaction.commit_manually

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

Ou si vous préférez les gestionnaires de contexte:

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

Aussi, si vous rencontrez des problèmes de mémoire contenant des connexions PostgreSQL vous ouvrez devez rechercher une solution de mise en commun en utilisant pgbouncer ou les différents pools de connexion de gevent qui existent. Vous devriez voir des gains de performance considérables de le faire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top