当前位置: 首页 > 面试题库 >

如何使Tornado中的SQLAlchemy异步?

茅高卓
2023-03-14
问题内容

如何使SQLAlchemyTornadoasync?我在异步mongo示例上找到了MongoDB的示例,但找不到motorfor的类似内容SQLAlchemy。有谁知道如何SQLAlchemy执行查询tornado.gen(我在MySQL下面使用SQLAlchemy,当我的处理程序从数据库读取并返回结果时,我想使这个异步)。


问题答案:

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

上面的代码执行了看似简单的操作,在连接上执行了一条SQL语句。但是,使用像psycopg2的async扩展这样的完全异步的DBAPI,以上代码在IO上至少会阻塞3次。因此,以显式异步方式编写上述代码,即使没有使用异步引擎并且回调实际上并未阻塞,也意味着上述外部函数调用至少变为三个函数调用,而不是一个,不包括所施加的开销由显式异步系统或DBAPI自己调用。因此,一个简单的应用程序将自动获得围绕语句执行的简单抽象的函数调用开销的3倍的损失。在Python中,函数调用开销就是一切。

由于这些原因,我仍然对围绕显式异步系统的炒作不感到兴奋,至少在某种程度上,有些人似乎希望所有内容都实现异步,例如交付网页(请参阅node.js)。我建议改用隐式异步系统,尤其是gevent,您可以获得异步模型的所有非阻塞IO好处,而没有结构上的冗长/显式回调的缺点。我将继续尝试理解这两种方法的用例,因此,对于显式异步方法作为解决所有问题的解决方案的吸引力,我感到困惑,例如,如您在使用node.js所看到的那样-
我们正在使用脚本语言减少冗长程度和代码复杂性的第一位,并且对于诸如交付网页之类的简单事情进行显式异步似乎什么也没做,只是添加了样板,如果阻塞IO甚至是一个问题,它也可以通过gevent或类似方法自动化。像这样的情况(许多大容量网站使用同步IO模型就可以了)。基于Gevent的系统已经过生产验证,并且越来越流行,因此,如果您喜欢ORM提供的代码自动化功能,

更新 :Nick Coghlan指出了他关于显式与隐式异步主题的精彩文章,这也是必须在此处阅读的内容。我还得到了一个更新,那就是pep-3156现在欢迎与gevent的互操作性,从而扭转了其先前对gevent的兴趣,这在很大程度上要归功于Nick的文章。因此,一旦集成了这些方法的系统可用,将来我会推荐使用gevent作为数据库逻辑的混合式To​​rnado。



 类似资料:
  • 问题内容: 我已阅读flask-sqlalchemy或sqlalchemy,它们建议将flask-sqlalchemy与flask一起使用。我想遵循这种方法。 但是,我有一个为命令行脚本编写的现有模型,该模型基于sqlalchemy的declarative_base,例如, 我希望仍然可以在此模型中使用命令行脚本,但也希望围绕该模型构建Web应用程序。 有没有办法扩展现有模型,以获得使用flask

  • 问题内容: 我想将大量条目(〜600k)上传到PostgreSQL DB的一个简单表中,每个条目有一个外键,一个时间戳和3个浮点数。但是,每个条目要花费60毫秒才能执行此处所述的核心批量插入操作,因此整个执行过程将花费10个小时。我发现,这是方法的性能问题,但是已经用psycopg2 2.7中 的方法解决了。 我运行的代码如下: 我看到这是一个常见问题,但是我还没有设法在sqlalchemy本身中

  • 问题内容: 我有一个带有数据库和相应的 models.py 文件的现有Django应用程序。 我有一个新的Tornado应用程序,可以为其他应用程序提供Web服务。它需要从同一数据库读取/写入,并且我要使用的模型文件中有代码。 如何在Tornado请求处理程序中最好地使用Django数据库和模型?它像建立到 models.py Django项目文件夹的符号链接,导入Django模块并使用它那样简单

  • 这表明Docker postgresql(正在运行)在该端口不可用。我尝试将添加到我的中,但没有成功。有什么提示吗?

  • 本文向大家介绍Python的Tornado框架的异步任务与AsyncHTTPClient,包括了Python的Tornado框架的异步任务与AsyncHTTPClient的使用技巧和注意事项,需要的朋友参考一下 高性能服务器Tornado Python的web框架名目繁多,各有千秋。正如光荣属于希腊,伟大属于罗马。Python的优雅结合WSGI的设计,让web框架接口实现千秋一统。WSGI 把应用

  • 现在;我得到以下错误: 我以为这是因为我没有在会话中使用那个数据库;所以我去处理使用session.execute并使用sql语句use来使用数据库,但它给我带来了语法错误 check_if_exists=session.query(latest_movies_scraper).filter_by(name=dictionary['title']).first()