所以我正在编写另一个基于Twisted的守护进程.它将照常有一个xmlrpc接口,这样我就可以轻松地与它通信,并让其他进程根据需要与它交换数据.
此守护进程需要访问数据库.在我们的最新项目中,我们一直在使用SQL炼金术,而不是硬编码SQL字符串--这些字符串大多是为pylons中的Web应用程序完成的.
我们也希望对这个应用程序执行同样的操作,并重用使用SQL Alchemy的库代码.那该怎么办呢?当然,由于该库是为在Pylons应用程序中使用而编写的,所以所有人都习惯了直截了当的阻塞样式代码,所有非阻塞都由Pylons通过线程、线程局部变量、作用域会话等神奇地处理.
所以现在对于Twisted,我想我有点卡住了.我可以:
- 只要直接编写我需要的SQL(如果它是最小的),并在我需要访问数据库时使用Twisted中的dbapi池来执行runInteraction等.
- 时不时地在我的Twisted守护进程中使用我们的库和挡路中的对象和固有的阻塞方法.砰.
- 使用上一次更新于2008年的sAsync,并重用我们已经定义的模型,但实际上并没有,这并不能解决库代码也需要在挂架中工作的问题.这是否适用于最新版本的SQL Alchemy?谁知道呢.但那个项目看起来很棒——为什么它显然被放弃了?
- 生成一个单独的子进程,让它处理库代码及其阻塞的所有内容,当准备好作为通过YAML over xmlrpc封送的对象时,结果将返回给我的守护进程.
- 使用deferToThread,然后删除返回的对象,并确保执行Eager 加载,这样我就有了我可能需要的所有东西.在我看来有点像乌嘎.
我也被困在Python2.5.4ATM上,所以现在还没有2.6,我想我不能仅仅通过将来的导入来访问里面很酷的新的多处理模块.不过,我想这没问题,因为我们已经很好地处理了进程间通信.
因此,我主要倾向于选项4,因为这将避免选项1的逻辑重复的致命错误,同时也远离线程.
不过,我的第一个try 是 Select 2,让事情继续进行,然后将对库代码的调用分离出来,如果看起来很有可能需要花点时间在挡路上的话,可能会放到一个单独的进程中.悲伤的.也许Stackless Python和Twisted的组合在这里会很有趣.
还有更好的主意吗?