Twisted + SQLAlchemy以及最好的方法

时间:2010-06-10 18:00:43

标签: python sql database sqlalchemy twisted

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

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

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

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

  1. 如果它是最小的,只需直接编写我需要的sql,当我需要点击数据库时,使用twisted中的dbapi池来执行runInteractions等。
  2. 在我们的库中使用对象和固有的阻塞方法,然后阻止我的Twisted守护进程。呸。
  3. 使用2008年最后一次更新的sAsync,重用我们已经定义的模型但不是真的,这并不能解决库代码也需要在Pylons中工作的问题。这甚至适用于最新版本的SQL Alchemy吗?谁知道。那个项目看起来很棒 - 它为什么显然被抛弃了?
  4. 生成一个单独的子进程,并让它处理库代码及其所有阻塞,结果返回到我的守护进程,准备好作为通过YAML通过xmlrpc编组的对象。
  5. 使用deferToThread,然后清除返回的对象,确保执行急切的加载,以便我拥有我可能需要的所有东西。对我来说似乎有些不可思议。
  6. 我也使用Python 2.5.4 atm,所以还没有2.6,我不认为我可以从未来进行导入,以获得对那里很酷的新多处理模块的访问。虽然我认为我们已经很好地处理了进程间通信,但这没关系。

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

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

    有更好的想法吗?

4 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:6)

首先,遗憾的是,我只能说出你的观点 SQLAlchemy不能很好地发挥作用。我和两个人都做过一些工作 并且会有点担心会产生的复杂性 将它们组合在一起。

我所知道的所有数据库集成层都使用 扭曲线程集成层,如果你想避免它 所有费用你都在列表中的第4点。

另一方面,我看过数据库连接代码的例子 使用deferToThread()和工作得非常好的朋友。

无论如何,如果你准备好考虑其他框架,请注意一些事项 比SQLAlchemy:

DivMod家伙一直在做一些关于扭曲的试验性工作 - 基于Storm ORM的数据库集成(google for“storm orm”)。

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

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

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

答案 2 :(得分:6)

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

可悲的是,sqlalchemy在实现审计异步使用方面要复杂得多。如果你真的想使用它,我建议使用存储rpc层的进程外方法。

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

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

答案 3 :(得分:3)

也许扭曲是你正在寻找的。它是扭曲的本机活动记录(又名ORM)实现,在twisted.enterprise.adbapi之上工作。

http://findingscience.com/twistar/