我们的项目包括同步应用程序(短生命周期)和异步扭曲应用程序(长生命周期)。我们正在重构我们的数据库,并将构建一个API模块来解耦该模块中的所有SQL。我想创建该API,以便同步和异步应用程序都可以使用它。对于同步应用程序,我希望对数据库API的调用只返回数据(阻塞),就像使用MySQLdb一样;但对于异步应用程序,我希望对相同API函数/方法的调用是非阻塞的,可能会返回延迟的。任何人有任何提示,建议或帮助,他们可能会提供我做这件事?提前谢谢你,道格
发布于 2009-11-10 14:26:55
twisted.enterprise.adbapi似乎是可行的--您认为它不能满足您的需求吗?如果是,您能解释一下原因吗?
发布于 2009-11-11 08:17:49
在Twisted中,您基本上需要一个函数的包装器,该函数返回一个延迟(比如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,但这将涉及到更多的代码路径,这些路径做同样的事情。
发布于 2009-11-10 11:26:45
你有没有考虑过从continuation-passing style借用一个页面?Stackless Python supports continuations directly,如果您正在使用它,并且这种方法似乎已经有了gained some interest。
https://stackoverflow.com/questions/1705444
复制相似问题