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
上面的代码执行了看似简