2009-11-10 13 views
5

I nostri progetti al lavoro includono applicazioni sincrone (di breve durata) e asincrone Twisted (longeva). Stiamo ri-factoring del nostro database e stiamo andando a costruire un modulo API per disaccoppiare tutto l'SQL in quel modulo. Mi piacerebbe creare quell'API in modo che sia le applicazioni sincrone che quelle asincrone possano usarlo. Per le applicazioni sincrone mi piacerebbe che le chiamate all'API del database restituissero semplicemente i dati (bloccati) proprio come l'utilizzo di MySQLdb, ma per le applicazioni asincrone vorrei che le chiamate alle stesse funzioni/metodi API fossero non bloccanti, probabilmente restituendo un differito. Qualcuno ha qualche suggerimento, suggerimento o aiuto che potrebbe offrirmi per fare questo? Grazie in anticipo, DougPython Collegamenti intrecciati e database

risposta

3

twisted.enterprise.adbapi sembra la strada da percorrere - pensi che non riesca a soddisfare le tue esigenze e, in caso affermativo, puoi spiegare perché?

1

All'interno di Twisted, si desidera sostanzialmente un wrapper attorno a una funzione che restituisce un rinvio (come il livello DB contorto), attende i risultati e li restituisce. Tuttavia, non è possibile attendere, poiché l'utilizzo dei cicli del reattore e il controllo di un'attività da completare utilizzando l'attesa di blocco non bloccata è probabilmente inefficiente.

InlineCallbacks o deferredGenerator risolvono il problema? Richiedono un moderno Twisted. See the twistedmatrix docs.

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

Un'altra opzione sarebbe quella di avere due metodi che eseguono lo stesso modello SQL, uno che utilizza runInteraction, che blocca, e uno che utilizza RunQuery, che restituisce un differito, ma che comporterebbe ulteriori percorsi di codice che fanno la stessa cosa.

0

Tutte le librerie di database che ho visto sembrano ostinatamente sincrone.

Sembra che Twisted.enterprise.abapi risolva questo problema utilizzando un thread per gestire un pool di connessioni e avvolgere le librerie di database sottostanti. Questo ovviamente non è l'ideale, ma suppongo che funzionerebbe, ma in realtà non l'ho provato io stesso.

Idealmente ci sarebbe un modo per avere sqlalchemy e twisted integrated. Ho trovato questo progetto, nadbapi, che afferma di farlo, ma sembra che non sia stato aggiornato dal 2007.

Problemi correlati