2009-11-10 8 views
5

Nuestros proyectos en el trabajo incluyen aplicaciones síncronas (efímeras) y aplicaciones Twisted asíncronas (de larga duración). Estamos reorganizando nuestra base de datos y vamos a construir un módulo API para desacoplar todo el SQL en ese módulo. Me gustaría crear esa API para que las aplicaciones sincrónicas y asíncronas puedan usarla. Para las aplicaciones síncronas, me gustaría que las llamadas a la base de datos API simplemente devuelvan datos (bloqueo) al igual que usar MySQLdb, pero para las aplicaciones asíncronas me gustaría que las llamadas a las mismas funciones/métodos API no sean bloqueantes, probablemente regresando a diferido ¿Alguien tiene alguna pista, sugerencia o ayuda que puedan ofrecerme para hacer esto? Gracias de antemano, DougPython Twisted y conexiones de base de datos

Respuesta

3

twisted.enterprise.adbapi parece el camino a seguir, ¿cree que no cumple con sus requisitos y, de ser así, puede explicar por qué?

1

Dentro de Twisted, básicamente desea un contenedor alrededor de una función que devuelve un aplazado (como la capa Twisted DB), espera sus resultados y los devuelve. Sin embargo, no puede estar ocupado, ya que eso consume los ciclos de su reactor, y la verificación de que una tarea se complete con la espera Twisted no bloqueante probablemente sea ineficiente.

Will inlineCallbacks or deferredGenerator ¿resuelve su problema? Requieren un Twisted moderno. See the twistedmatrix docs.

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

Otra opción sería tener dos métodos que ejecutan la misma plantilla de SQL, uno que utiliza runInteraction, que bloquea, y uno que utiliza runQuery, que devuelve un diferido, pero eso implicaría más rutas de código que hacen la misma cosa.

0

Todas las bibliotecas de base de datos que he visto parecen ser obstinadamente sincrónicas.

Parece que Twisted.enterprise.abapi resuelve este problema mediante el uso de subprocesos para administrar un grupo de conexiones y ajustar las bibliotecas de bases de datos subyacentes. Obviamente, esto no es ideal, pero supongo que funcionaría, pero en realidad no lo he intentado yo mismo.

Idealmente, habría alguna forma de tener sqlalchemy y twisted integrado. Encontré este proyecto, nadbapi, que pretende hacerlo, pero parece que no se ha actualizado desde 2007.

Cuestiones relacionadas