Django, длинный опрос Ajax, Postgresql: бездействующая транзакция - PullRequest
7 голосов
/ 16 февраля 2012

Я реализовал чат, используя длинный опрос ajax и Gevent. Чтобы прочитать, клиент ajax вид обновления и ждать с Gevent.event.wait для обновления.

Проблема: Транзакция Postgresql, открытая Django в начале запроса (для получения информации о сеансе), не закрывается до конца запроса. И эти пустые транзакции занимают много памяти.

Какой самый чистый способ закрыть транзакцию Postgresql не закрывая запрос? Я сейчас отправляю request_finished сигнал вручную, но похоже на взлом.

Ответы [ 2 ]

2 голосов
/ 16 февраля 2012

То, как вы это делаете, - это, пожалуй, лучший путь в рамках вашего хака. Есть ли какая-то причина, по которой вы пытаетесь провести длинный опрос в процессе запрос-ответ, вместо использования чего-то вроде django-socketio ?

0 голосов
/ 16 февраля 2012

Смотрите здесь: 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()

Или, если вы предпочитаете контекстные менеджеры:

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

Также, если у вас возникают проблемы с памятью, когда открытые соединения PostgreSQL открыты, вы должны искать решение для пула с использованием pgbouncer или различных существующих пулов соединений Gevent. Вы должны увидеть значительный прирост производительности от этого.

...