Twisted + SQLAlchemy以及最好的方法

Kho*_*rak 31 python sql database sqlalchemy twisted

所以我正在编写另一个基于Twisted的守护进程.它将像往常一样有一个xmlrpc接口,因此我可以轻松地与它进行通信,并让其他进程根据需要与它交换数据.

该守护进程需要访问数据库.我们一直在使用SQL Alchemy代替我们最新项目的硬编码SQL字符串 - 这些项目主要用于Pylons中的Web应用程序.

我们想对这个应用程序做同样的事情并重新使用利用SQL Alchemy的库代码.那么该怎么办?当然,因为该库是为Pylons应用程序编写的,所以每个人都习惯使用的所有直接阻塞样式代码,所有非阻塞都由Pylons通过线程,线程本地,范围会话等神奇地处理.上.

所以现在对Twisted我想我有点卡住了.我可以:

  1. 如果它是最小的,请直接编写我需要的sql,并在我需要命中db时使用twisted中的dbapi池来执行runInteractions等.
  2. 在我们的库中使用对象和固有的阻塞方法,然后在我的Twisted守护进程中阻塞.呸.
  3. 使用2008年最后一次更新的sAsync,并重用我们已经定义的模型但不是真的,这并不能解决库代码也需要在Pylons中工作的问题.这甚至适用于最新版本的SQL Alchemy吗?谁知道.那个项目看起来很棒 - 它为什么显然被抛弃了?
  4. 生成一个单独的子进程并让它处理库代码及其所有阻塞,结果返回到我的守护进程准备好后作为通过YAML通过xmlrpc编组的对象.
  5. 使用deferToThread,然后删除返回的对象,确保执行急切的加载,以便我拥有我可能需要的所有东西.对我来说似乎有些丑陋.

我也坚持使用Python 2.5.4 atm所以还没有2.6,我不认为我可以从未来进行导入以获得那里很酷的新多处理模块的东西.虽然我认为我们已经很好地处理了进程间通信,但这没关系.

所以我倾向于选项4,因为这样可以避免与选项1的逻辑重复的致命罪,同时也避免线程.

我的第一次尝试将是选项2,只是让事情继续进行,然后将对库代码的调用分离出来,如果它看起来好像很可能需要花费太长时间才能阻塞.伤心.也许Stackless Python和Twisted的组合在这里会很有趣.

有更好的想法吗?

Gly*_*yph 10

在这几年中,Alex Gaynor创建了https://github.com/alex/alchimia,它可能是与SQLAlchemy和Twisted集成的更好的中央存储库.

  • 是.ORM期望能够在其执行中的任意位置运行阻塞查询,从而无法将实际数据库I/O与查询组合分开.除非SQLAlchemy ORM发生重大变化,否则不太可能通过Twisted实现与它的直接集成. (2认同)

Jac*_*son 6

首先,遗憾的是,我认为扭曲和SQLAlchemy并不能很好地发挥作用.我和两者都做过一些工作,并且有点担心将它们放在一起会产生的复杂性.

到目前为止,我所知道的所有数据库集成层都使用了扭曲的线程集成层,如果你想不惜一切代价避免这种情况,那么你的列表中的第4点几乎就是这样.

另一方面,我已经看到了使用deferToThread()和非常好用的朋友连接代码的数据库示例.

无论如何,如果你准备好考虑除SQLAlchemy之外的其他框架的一些指针:

DivMod的人一直在做一些关于基于Storm ORM的扭曲数据库集成的试验性工作(google用于"风暴orm").

请参阅此链接以获取示例:

http://divmod.readthedocs.org/en/latest/products/nevow/storm-approach.html

另外,请访问DivMod的网站并查看他们的Axiom数据库层的来源(可能对您没有任何用处,因为它只是Sqlite,但它的原则可能很有用).


kap*_*ilt 6

在启动板https://code.launchpad.net/~therve/storm/twisted-integration上有一个风暴分支可以直接使用(在内部它会延迟线程).我很好地使用了它.

遗憾的是,sqlalchemy在实施中要求审计异步使用要复杂得多.如果你真的想使用它,我建议使用存储rpc层的进程外方法.

或者,如果您喜欢冒险并使用postgresql,最新的pyscopg2支持真正的异步使用(https://launchpad.net/txpostgres),风暴源很容易破解;-)

顺便说一句,你去年尝试的风暴可能没有默认启用C-extension(现在是最新版本),这可能是你速度问题的原因.