所以我在写另一个基于扭曲的守护进程。它将像往常一样有一个xmlrpc接口,这样我就可以轻松地与它通信,并让其他进程根据需要与它交换数据。
这个守护进程需要访问数据库。我们一直在使用SQL炼金术来代替最新项目中的硬编码SQL字符串,这些项目主要是为Pylons中的web应用程序完成的。
我们希望对此应用程序执行相同的操作,并重用使用SQL炼金术的库代码。那该怎么办?当然,既然这个库是为在Pylons应用程序中使用而编写的,那么它就是所有人都习惯的直截了当的阻塞式代码,而且所有的非阻塞性代码都是由Pylons通过线程、线程局部变量、作用域会话等神奇地处理的。
所以现在对于扭曲我想我有点卡住了。我可以:
我也一直在使用Python 2.5.4atm,所以还没有2.6版本,而且我不认为我可以从未来做一个导入来访问那里酷的新的多处理模块。不过我想这没关系,因为我们已经很好地处理了进程间通信。
所以我倾向于选择4,主要是因为这样可以避免逻辑重复的致命错误,同时也可以远离线程。
不过,我的第一个尝试是选择2,让事情继续进行,然后将对库代码的调用分离出来,如果看起来某个东西可能需要花费太长时间才能被阻塞,那么可能会将调用分离到一个单独的进程中。悲伤。也许无堆栈Python和Twisted的组合在这里会很有趣。
有更好的主意吗?
首先,不幸的是,我只能支持你扭曲和 SQLAlchemy玩得不太好。我和他们一起工作过 会有点害怕 把它们放在一起。
到目前为止我知道的所有数据库集成层 twisteds线程集成层,如果您想避免 所有的花费你几乎都被你的清单上的第4点所束缚。
另一方面,我看到了数据库连接代码的示例 使用deferToThread()和运行良好的朋友。
不管怎样,如果你准备好考虑其他框架 比炼金术:
DivMod的人在twisted上做了一些尝试性的工作- 基于风暴ORM的数据库集成(google表示风暴ORM)。
有关示例,请参见此链接:
http://divmod.readthedocs.org/en/latest/products/nevow/storm-approach.html
另外,去DivMod的网站看看 他们的Axiom数据库层(可能对您没有任何直接的用处,因为 它只是Sqlite,但它的原则可能是有用的)。
在launchpadhttps://code.launchpad.net/~therve/storm/twisted-integration上有一个风暴分支可以直接与twisted一起使用(在内部它执行延迟到线程的操作)。我用得很好。
遗憾的是,sqlalchemy在审计异步使用方面的实现要复杂得多。如果您真的想使用它,我建议使用进程外的存储rpc层方法。
或者,如果您感到冒险并使用postgresql,那么最新的pyscopg2支持真正的异步用法(https://launchpad.net/txpostgres),而且风暴源非常容易破解;-)
顺便说一句,你去年尝试的风暴可能没有默认启用C扩展(现在是最新版本),这可能会导致你的速度问题。
在接下来的几年中,Alex Gaynor创建了https://github.com/alex/alchimia,这可能是一个更好的与SQLAlchemy和Twisted集成的中央存储库。
相关问题 更多 >
编程相关推荐