Frage

Ich habe einen Chat implementiert, wobei ich Ajax Long Polling und Gevent verwendete. Um zu lesen, wecke der Client die Aktualisierungsansicht und warte mit GeVent.event.event.ew.wait auf ein Update.

Problem: Die von Django zu Beginn einer Anfrage eröffnete Postgresql -Transaktion (um Sitzungsinformationen zu erhalten) erst am Ende der Anfrage geschlossen. Und diese Leerlauftransaktionen benötigen viel Speicher.

Was wäre der sauberste Weg, um die PostgreSQL -Transaktion zu schließen, ohne die Anfrage zu schließen? Ich sende derzeit das Signal Request_Finished manuell, aber es fühlt sich wie ein Hack an.

War es hilfreich?

Lösung

Die Art und Weise, wie Sie es tun, ist wahrscheinlich der beste Weg im Rahmen Ihres Hacks. Gibt es einen Grund, warum Sie versuchen, Long-Poll in den Anforderungsreaktionsprozess zu schulen, anstatt etwas wie zu verwenden Django-socketio?

Andere Tipps

Siehe hier: https://docs.djangoproject.com/en/dev/topics/db/transactions/#django.db.transaction.commit_manuell

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

Oder wenn Sie Kontextmanager bevorzugen:

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

Auch wenn Sie Speicherprobleme haben, die PostgreSQL -Verbindungen geöffnet halten, sollten Sie eine Pooling -Lösung mit PGBouncer oder den verschiedenen bestehenden Gevent -Verbindungspools suchen. Sie sollten einige beträchtliche Leistungssteigerungen dadurch sehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top