tornado mysql 异步_python-如何使Tornado中的SQLAlchemy异步?

本文探讨了在Tornado中使用SQLAlchemy进行异步数据库操作的挑战,包括ORM的延迟加载与异步编程的冲突,以及显式异步模型带来的性能损失。建议使用隐式异步系统如gevent,以平衡异步IO的好处和代码复杂性。更新提到PEP 3156现在支持与gevent互操作,为未来提供了更多可能性。
摘要由CSDN通过智能技术生成

ORM非常不适合显式异步编程,也就是说,程序员必须在发生任何使用网络访问的事件时立即生成显式回调。 这样做的主要原因是ORM广泛使用了延迟加载模式,该延迟加载模式或多或少与显式异步不兼容。 看起来像这样的代码:

user = Session.query(User).first()

print user.addresses

实际上会发出两个单独的查询-一个在您说first()加载行时,另一个在您说user.addresses时(如果.addresses集合尚不存在或已过期)。 本质上,几乎所有处理ORM构造的代码行都可能在IO上阻塞,因此您会在几秒钟内陷入大量的回调意大利面条之中,更糟糕的是,这些代码行中的绝大部分实际上不会在IO上阻塞, 因此将回调连接在一起的所有开销(否则将是简单的属性访问操作)也将使程序的效率大大降低。

显式异步模型的主要问题是,它们给复杂系统增加了巨大的Python函数调用开销-不仅像延迟加载那样在面向用户的方面,而且在系统的内部方面,如何围绕 Python数据库API(DBAPI)。 为了使SQLAlchemy甚至具有基本的异步支持,将对绝大多数不使用异步模式的程序,甚至是那些非高度并发的异步程序,造成严重的性能损失。 考虑使用SQLAlchemy或任何其他ORM或抽象层,其代码可能如下所示:

def execute(connection, statement):

cursor = connection.cursor()

cursor.execute(statement)

results = cursor.fetchall()

cursor.close()

return results

上面的代码执行了看似简

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值