2009-11-10 76 views
5

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

回答

3

twisted.enterprise.adbapi似乎要走的路 - 你认为它不符合你的要求,如果是的话,你能解释为什么吗?

1

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

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

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

另一种选择是有其执行相同的SQL模板,其中一个采用runInteraction,该块和一个它采用runQuery,它返回一个递延两种方法,但是这将涉及更多的代码路径里面做一样的东西。

0

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

似乎Twisted.enterprise.abapi通过使用线程来管理连接池并包装底层数据库库来解决此问题。这显然不理想,但我认为它会起作用,但我自己并没有真正尝试过。

理想情况下,会有一些方法来使sqlalchemy和扭曲集成。我发现这个项目,nadbapi,声称这样做,但它看起来从2007年以来一直没有更新。