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

此守护进程需要访问数据库.在我们的最新项目中,我们一直在使用SQL炼金术,而不是硬编码SQL字符串--这些字符串大多是为pylons中的Web应用程序完成的.

我们也希望对这个应用程序执行同样的操作,并重用使用SQL Alchemy的库代码.那该怎么办呢?当然,由于该库是为在Pylons应用程序中使用而编写的,所以所有人都习惯了直截了当的阻塞样式代码,所有非阻塞都由Pylons通过线程、线程局部变量、作用域会话等神奇地处理.

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

  1. 只要直接编写我需要的SQL(如果它是最小的),并在我需要访问数据库时使用Twisted中的dbapi池来执行runInteraction等.
  2. 时不时地在我的Twisted守护进程中使用我们的库和挡路中的对象和固有的阻塞方法.砰.
  3. 使用上一次更新于2008年的sAsync,并重用我们已经定义的模型,但实际上并没有,这并不能解决库代码也需要在挂架中工作的问题.这是否适用于最新版本的SQL Alchemy?谁知道呢.但那个项目看起来很棒——为什么它显然被放弃了?
  4. 生成一个单独的子进程,让它处理库代码及其阻塞的所有内容,当准备好作为通过YAML over xmlrpc封送的对象时,结果将返回给我的守护进程.
  5. 使用deferToThread,然后删除返回的对象,并确保执行Eager 加载,这样我就有了我可能需要的所有东西.在我看来有点像乌嘎.

我也被困在Python2.5.4ATM上,所以现在还没有2.6,我想我不能仅仅通过将来的导入来访问里面很酷的新的多处理模块.不过,我想这没问题,因为我们已经很好地处理了进程间通信.

因此,我主要倾向于选项4,因为这将避免选项1的逻辑重复的致命错误,同时也远离线程.

不过,我的第一个try 是 Select 2,让事情继续进行,然后将对库代码的调用分离出来,如果看起来很有可能需要花点时间在挡路上的话,可能会放到一个单独的进程中.悲伤的.也许Stackless Python和Twisted的组合在这里会很有趣.

还有更好的主意吗?

推荐答案

首先,不幸的是,我只能赞同你的观点,那就是扭曲和 SQLAlChemy不能很好地配合.我和这两个人都做过一些工作 可能会有点害怕可能会产生的复杂性 把它们放在一起.

我所知道的到目前为止使用的所有数据库集成层

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

无论如何,如果您准备考虑其他框架,请提供一些提示 而不是SQLAlChemy:

DivMod的人一直在做一些关于扭曲的试探性工作- 基于Storm ORM(Google表示"Storm ORM")的数据库集成.

有关示例,请参阅此链接:

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

此外,前往DivMod的网站,看看这些信息的来源

Database相关问答推荐

网络分区恢复后副本的更新数据发生了什么

有没有办法使用 JPA 注释和 Hibernate 动态 Select @GeneratedValue 策略?

管理数据库中的产品计数

在 PostgreSQL 触发函数中使用 pg_notify

免费的 SQL 比较工具

如何验证 SQLAlchemy ORM 中的列数据类型?

matlab 数据文件到 pandas DataFrame

使用 Flask 时 Python 中持久数据库连接的最佳实践

PostgreSQL - 将每个表转储到不同的文件中

prices价格字段是浮动还是小数好点?

为什么在连接表上有一个主键不好?

MongoDB 和 PostgreSQL 的思考

什么是非关系数据库的例子?

如何在 Windows 中将用户添加到 PostgreSQL?

将用户数据存储在 LDAP 而不是 RDBMS 中的原因

如何将特定的、可变的 order订单保存到数据库中

在 SQL Server 中实施审计表的建议?

将查询限制为一条记录会提高性能吗

遍历数据库中的每条记录 - Ruby on Rails / ActiveRecord

Rails 控制台 - 查找在某天创建的位置