【发布时间】:2018-06-14 10:58:28
【问题描述】:
- 为什么在调用
session.close()和会话实际关闭之间似乎存在明显延迟? - 我正在以一种感觉不对劲的方式“用尽”连接。有没有更好的方法或我缺少的设计模式?
按照指南here,我使用以下代码,为了完整性而复制:
@contextmanager
def session_scope():
"""Provide a transactional scope around a series of operations."""
session = Session()
try:
yield session
session.commit()
except:
session.rollback()
raise
finally:
session.close()
def run_my_program():
with session_scope() as session:
ThingOne().go(session)
ThingTwo().go(session)
这对于可靠地提交数据和避免无效会话非常有用。 问题在于达到连接限制。
例如,假设我有一个页面每次访问进行 5 次异步调用。如果我访问该页面并快速连续点击刷新,它将产生5 * number_times_refreshed 连接。它最终会关闭它们,但会有不可忽略的时间延迟。
【问题讨论】:
-
Closing a session 不会关闭连接,而是将其返回到连接池,连接池将它们交给下一个需要的会话等。这就是它的基本原理,但我想说,“异步”这个词加上快速刷新使它变得更加复杂。
-
谢谢 - 我在本地做了更多测试。这是一个更新:当我使用上面的代码运行一个简单的程序时,连接按预期“关闭”(至少这是日志文件中使用的词) - 立即。但是,如果我在 with 块之后有一个 time.sleep() ,它似乎只会在 time.sleep() 完成后关闭连接。不确定我是否真的在这里遗漏了什么,但开始认为这是其他东西以某种方式影响它
标签: python postgresql session sqlalchemy psql