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
¿Ha considerado tomar prestada una página del continuation-passing style? Stackless Python supports continuations directly, si lo está usando, y el enfoque parece tener ya gained some interest.
twisted.enterprise.adbapi parece el camino a seguir, ¿cree que no cumple con sus requisitos y, de ser así, puede explicar por qué?
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.
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.
- 1. base de datos para Python Twisted
- 2. Base de datos y conexiones
- 3. Conexiones de base de datos y F #
- 4. Cliente y servidor UDP con Twisted Python
- 5. Python Twisted JSON RPC
- 6. conexión de base de datos compartida frente a conexiones de base de datos privadas
- 7. agrupación de conexiones de base de datos en ruby
- 8. Python twisted: ¿cómo programar?
- 9. Python twisted: dónde empezar
- 10. Crear un grupo de conexiones de base de datos
- 11. Python Twisted WebSocket cliente
- 12. Número de conexiones de base de datos abierta
- 13. Cómo gestiona Zend DB Conexiones de base de datos
- 14. php, mysql - Demasiadas conexiones al error de base de datos
- 15. se cierren las conexiones de base de datos en Java
- 16. Conexiones de base de datos nativas vs ODBC
- 17. Base de datos de Python
- 18. sitio de cometas de chat usando python y twisted
- 19. Codeigniter - conexiones múltiples a la base de datos
- 20. H2 Conexiones múltiples a la base de datos
- 21. Programación asincrónica en Python Twisted
- 22. ¿Anular el registro de Python Twisted?
- 23. Proxy de Python Twisted: cómo interceptar paquetes
- 24. compartir una base de datos entre el trenzado y Django
- 25. ¿Cómo ejecutas una aplicación Twisted a través de Python (en lugar de a través de Twisted)?
- 26. Aplicaciones twisted y p2p
- 27. conexiones de bases de datos múltiples: schema_migrations se busca en la base de datos incorrecta
- 28. pydev y twisted framework
- 29. Base de datos horizontal y base de datos vertical
- 30. ¿Puedo leer y escribir simultáneamente en una base de datos SQLite desde múltiples conexiones?