5

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

4

4 回答 4

3

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

于 2009-11-10T06:26:54.753 回答
1

Within Twisted, you basically want a wrapper around a function which returns a Deferred (such as the Twisted DB layer), waits for it's results, and returns them. However, you can't busy-wait, since that's using up your reactor cycles, and checking for a task to complete using the Twisted non-blocking wait is probably inefficient.

Will inlineCallbacks or deferredGenerator solve your problem? They require a modern Twisted. See the twistedmatrix docs.

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

Another option would be to have two methods which execute the same SQL template, one which uses runInteraction, which blocks, and one which uses runQuery, which returns a Deferred, but that would involve more code paths which do the same thing.

于 2009-11-11T00:17:49.403 回答
0

您是否考虑过从continuation-passing style借用页面?Stackless Python直接支持延续,如果您正在使用它,并且该方法似乎已经引起了一些兴趣

于 2009-11-10T03:26:44.513 回答
0

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

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

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

于 2009-11-12T08:54:48.863 回答