Python Twisted和数据库连接

时间:2009-11-10 03:20:59

标签: python mysql database twisted

我们的工作项目包括同步应用程序(短期)和异步Twisted应用程序(长期存在)。我们正在重新分解我们的数据库,并将构建一个API模块来解耦该模块中的所有SQL。我想创建该API,以便同步和异步应用程序都可以使用它。对于同步应用程序,我想调用数据库API只返回数据(阻塞),就像使用MySQLdb一样,但对于异步应用程序,我想调用相同的API函数/方法是非阻塞的,可能返回延期。任何人都有任何提示,建议或帮助他们可能会让我这样做? 提前致谢, 道格

4 个答案:

答案 0 :(得分:3)

twisted.enterprise.adbapi似乎要走了 - 你认为它不符合你的要求,如果是的话,你能解释一下原因吗?

答案 1 :(得分:1)

在Twisted中,你基本上想要一个函数的包装器,它返回一个Deferred(例如Twisted DB层),等待它的结果,然后返回它们。但是,您不能忙等待,因为这会耗尽您的反应堆周期,并且使用Twisted非阻塞等待检查任务完成可能效率低下。

inlineCallbacks或deferredGenerator会解决您的问题吗?他们需要现代的Twisted。 See the twistedmatrix docs

def thingummy():
   thing = yield makeSomeRequestResultingInDeferred()
   print thing #the result! hoorj!
thingummy = inlineCallbacks(thingummy)

另一个选择是有两个执行相同SQL模板的方法,一个使用runInteraction,哪个阻塞,一个使用runQuery,它返回一个Deferred,但这将涉及更多的代码路径同样的事情。

答案 2 :(得分:0)

您是否考虑过从continuation-passing style借用一个页面? Stackless Python supports continuations directly,如果您正在使用它,并且该方法似乎已经有gained some interest

答案 3 :(得分:0)

我见过的所有数据库都似乎是固执的同步。

看来Twisted.enterprise.abapi通过使用线程来管理连接池和包装底层数据库库来解决这个问题。这显然不是理想的,但我认为它会起作用,但我实际上并没有亲自尝试过。

理想情况下,有一些方法可以将sqlalchemy和twisted整合在一起。我找到了这个项目nadbapi,声称这样做,但看起来它自2007年以来一直没有更新。