2009-11-10 3 views
5

Unsere Projekte bei der Arbeit umfassen synchrone Anwendungen (kurzlebige) und asynchrone Twisted-Anwendungen (langlebig). Wir re-factorieren unsere Datenbank und bauen ein API-Modul auf, um die gesamte SQL in diesem Modul zu entkoppeln. Ich möchte diese API erstellen, damit sie von synchronen und asynchronen Anwendungen verwendet werden kann. Für die synchronen Anwendungen möchte ich, dass Aufrufe an die Datenbank-API nur Daten zurückgeben (blockieren), genau wie MySQLdb, aber für die asynchronen Anwendungen möchte ich, dass Aufrufe derselben API-Funktionen/Methoden nicht blockierend sind und wahrscheinlich zurückkehren ein aufgeschobener. Hat jemand irgendwelche Hinweise, Vorschläge oder Hilfe, die er mir anbietet, dies zu tun? Vielen Dank im Voraus, DougPython Twisted und Datenbankverbindungen

Antwort

3

twisted.enterprise.adbapi scheint der Weg zu gehen - denken Sie, es entspricht nicht Ihren Anforderungen, und wenn ja, können Sie bitte erklären, warum?

1

Innerhalb von Twisted möchten Sie grundsätzlich einen Wrapper um eine Funktion, die einen Deferred (wie die Twisted DB-Ebene) zurückgibt, auf ihre Ergebnisse wartet und sie zurückgibt. Sie können jedoch nicht damit rechnen, zu warten, da die Reaktorzyklen aufgebraucht sind und die Prüfung auf eine Aufgabe mit der nicht blockierenden Wartezeit Twisted wahrscheinlich ineffizient ist.

Wird inlineCallbacks oder deferredGenerator Ihr Problem lösen? Sie benötigen eine moderne Twisted. See the twistedmatrix docs.

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

wäre eine weitere Option sein, zwei Methoden zu haben, die die gleiche SQL-Vorlage ausführen, eine, die runInteraction, die Blöcke, und eine, die runQuery verwendet verwendet, die eine latente zurückkommt, aber das würde mehr Codepfade umfassen, die tun das gleiche.

0

Alle Datenbankbibliotheken, die ich gesehen habe, scheinen stur synchron zu sein.

Es scheint, dass Twisted.enterprise.abapi dieses Problem löst, indem ein Thread verwendet, um einen Verbindungspool zu verwalten und die zugrunde liegenden Datenbankbibliotheken zu umhüllen. Dies ist offensichtlich nicht ideal, aber ich nehme an, es würde funktionieren, aber ich habe es nicht selbst ausprobiert.

Idealerweise gäbe es einen Weg, um sqlalchemy und twisted integriert zu haben. Ich fand dieses Projekt, nadbapi, das behauptet, es zu tun, aber es sieht aus wie es seit 2007 nicht aktualisiert worden ist.