我使用 ajax 长轮询和 Gevent 实现了一个聊天。要阅读,客户端 ajax 更新视图并使用 Gevent.event.wait 等待更新。
问题:Django 在请求开始时打开的 Postgresql 事务(用于获取会话信息)直到请求结束才关闭。而那些空闲的事务会占用大量内存。
在不关闭请求的情况下关闭 Postgresql 事务的最干净的方法是什么?我目前正在手动发送 request_finished 信号,但感觉就像是 hack。
我使用 ajax 长轮询和 Gevent 实现了一个聊天。要阅读,客户端 ajax 更新视图并使用 Gevent.event.wait 等待更新。
问题:Django 在请求开始时打开的 Postgresql 事务(用于获取会话信息)直到请求结束才关闭。而那些空闲的事务会占用大量内存。
在不关闭请求的情况下关闭 Postgresql 事务的最干净的方法是什么?我目前正在手动发送 request_finished 信号,但感觉就像是 hack。
无论如何,你这样做的方式可能是你的黑客框架内最好的方式。您是否有任何理由尝试将长轮询插入请求响应过程而不是使用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 连接池寻找池解决方案。你应该会看到这样做的一些可观的性能提升。