7

我使用 ajax 长轮询和 Gevent 实现了一个聊天。要阅读,客户端 ajax 更新视图并使用 Gevent.event.wait 等待更新。

问题:Django 在请求开始时打开的 Postgresql 事务(用于获取会话信息)直到请求结束才关闭。而那些空闲的事务会占用大量内存。

在不关闭请求的情况下关闭 Postgresql 事务的最干净的方法是什么?我目前正在手动发送 request_finished 信号,但感觉就像是 hack。

4

2 回答 2

2

无论如何,你这样做的方式可能是你的黑客框架内最好的方式。您是否有任何理由尝试将长轮询插入请求响应过程而不是使用django-socketio之类的东西?

于 2012-02-16T00:36:40.987 回答
0

见这里: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 连接池寻找池解决方案。你应该会看到这样做的一些可观的性能提升。

于 2012-02-16T11:22:45.970 回答