Python Twisted与数据库连接

5 投票
4 回答
6086 浏览
提问于 2025-04-15 15:50

我们在工作中的项目包括同步应用(短时间运行的)和异步的Twisted应用(长时间运行的)。我们正在重构我们的数据库,并打算建立一个API模块,以便将所有的SQL操作与这个模块分开。我想创建这个API,让同步和异步的应用都能使用。对于同步应用,我希望数据库API的调用能够直接返回数据(阻塞),就像使用MySQLdb一样;而对于异步应用,我希望调用同样的API函数/方法时能够不阻塞,可能会返回一个延迟对象。有没有人能给我一些提示、建议或帮助呢?提前谢谢大家,Doug

4 个回答

0

你有没有想过借鉴一下“继续传递风格”(continuation-passing style)呢?如果你在使用无栈Python(Stackless Python),它直接支持继续传递的功能。而且这种方法似乎已经引起了一些关注。

1

在Twisted中,你基本上需要一个函数的包装器,这个函数会返回一个Deferred(比如Twisted的数据库层),然后等待它的结果,并把结果返回。不过,你不能一直等待,因为那样会浪费你的反应器周期。而使用Twisted的非阻塞等待来检查任务是否完成,可能效率也不高。

使用inlineCallbacks或deferredGenerator能解决你的问题吗?它们需要一个现代版本的Twisted。查看twistedmatrix文档

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

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

3

twisted.enterprise.adbapi 似乎是个不错的选择——你觉得它不符合你的需求吗?如果是的话,能不能告诉我为什么?

撰写回答