2012-02-15 14 views
7

Zaimplementowałem czat, używając długiego sondowania ajax i Gevent. Aby przeczytać, klient ajax widok aktualizacji i czekać z Gevent.event.wait na aktualizację.Django, Ajax long polling, Postgresql: bezczynna transakcja

Problem: Transakcja PostgreSQL uruchomiona przez Django na początku żądania (aby uzyskać informacje o sesji) nie jest zamykana do końca żądania. A te bezczynne transakcje zabierają dużo pamięci.

Jaki byłby najczystszy sposób zamknięcia transakcji PostgreSQL bez zamykania żądania? Obecnie wysyłam ręcznie sygnał request_finished request, ale wydaje mi się, że jest to hack.

Odpowiedz

2

Sposób, w jaki to robisz, jest prawdopodobnie najlepszym sposobem w ramach hack'a. Czy istnieje jakikolwiek powód, dla którego próbujesz wykonać długofalową sesję z butami z klapami w procesie żądania-odpowiedzi, zamiast używać czegoś takiego jak django-socketio?

+0

Straciliśmy długi czas, próbując sprawić, by socketio działało poprzez nginx (front end) z gevent/gunicorn/apache (back end). Nginx nie może tego zrobić bez dużej ilości modów. I nawet z tymi, nie byliśmy w stanie połączyć identyfikatora użytkownika socketio z identyfikatorem sesji django, więc nie byliśmy w stanie uzyskać informacji o użytkowniku. Jeśli masz kompletny samouczek do rekomendacji, chcielibyśmy go zobaczyć. Większość tutorialu z samouczkami socketio, które znaleźliśmy, nie używa informacji django użytkownika ani interfejsu użytkownika. – Ashe

+1

Jeśli chodzi o tworzenie backendów SocketIO i django auth: https://gist.github.com/fd8e9631368e447de702 –

+0

Szczerze mówiąc, nie wycofamy się teraz, ale ostatecznie zachowamy to na później. Dziękuję Ci. – Ashe

0

Zobacz tutaj: 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() 

Lub jeśli wolisz menedżerów kontekstu:

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

Także jeśli masz problemy z pamięcią trzymające połączeń PostgreSQL otworzyć należy szukać rozwiązania poolingu lub używając pgbouncer różne istniejące pule połączeń gevent. Powinieneś dostrzec spore przyrosty wydajności.

+0

Próbowaliśmy z przywróceniem, zrobimy test z zatwierdzeniem i sprawdzimy poprawność odpowiedzi, jeśli działa. I popatrz na polecane przez ciebie produkty. Dziękuję za odpowiedź! – Ashe

+0

To nie działa dla nas. Domyślam się, że transakcja została otwarta wewnątrz commit_manually, a ta otwierana wcześniej przez django nie jest taka sama (lub jest coś, czego nie rozumiemy). Wciąż mamy nieużywane połączenie, kiedy używamy tej techniki zamiast naszego (brzydkiego) hacka. – Ashe