Вопрос

Я внедрил чат, используя Ajax Long Offilling и Gevent. Чтобы прочитать, клиент Ajax - обновление представления и подождите с Gevent.event.Vait для обновления.

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

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

Это было полезно?

Решение

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

Другие советы

Глянь сюда: 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, которые существуют. Вы должны увидеть значительный результат производительности от этого.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top