Tengo la impresión de que las llamadas a bases de datos a través de SQLAlchemy se bloquearán y no son adecuadas para usar en ningún otro que no sea código síncrono. ¿Estoy en lo correcto (espero no estarlo) o hay una forma de configurarlo para que no sea bloqueante?¿Se puede configurar SQLAlchemy para que no sea bloqueante?
Respuesta
Puede usar SQLA en un estilo sin bloqueo usando gevent. Aquí hay un ejemplo usando psycopg2, usando de coroutine support psycopg2: gente
https://bitbucket.org/zzzeek/green_sqla/
También he oído utilizan la misma idea con pymysql. Como pymysql está en Python puro y usa la biblioteca de sockets, gevent remueve la biblioteca de socket para que sea asíncrona.
¡Excelente! Gracias. ¿Hay alguna advertencia que deba tener en cuenta (que no aparece en los documentos) cuando se usa de esta manera? – Matty
no estoy seguro. Encontré que parecía funcionar mejor usando NullPool, que deshabilita la agrupación. De lo contrario, algo estaba haciendo que se cuelgue. Así que tal vez proceda con precaución para comenzar con ... – zzzeek
@zzzeek Sus cuelgues pueden provenir del grupo predeterminado de SQLAlchemy (QueuePool) usando subprocesos sin parche de monos. Aplica el parche de gevent para el mono o crea una versión verde de QueuePool en el ejemplo en https://groups.google.com/forum/#!msg/gevent/533wzrnL0Fs/ijL34u5prYIJ. Eso solucionó el mismo comportamiento cuando lo tenía. – CryingCyclops
Eche un vistazo a Tornado ya que tienen algunas geniales bibliotecas sin bloqueo, particularmente tornado.gen.
Lo usamos junto con Momoko, un psycopg wrapper lib sin bloqueo para Tornado. Ha sido genial hasta ahora. Quizás el único inconveniente es que pierdes todas las cosas del objeto modelo que SQLAlchemy te da. El rendimiento es irreal sin embargo.
He estado mirando a Tornado y es posible que recorra ese camino. Tal vez debería escribir algún código de demostración para probar esto, pero si el controlador psycopg soporta llamadas de base de datos asincrónicas (que aparentemente lo hace), supongo que sería posible hacer llamadas DB no bloqueantes con SQLAlchemy. – Matty
@Matty Buena idea, me encantaría saber cómo te va. Uno de los principales problemas que imagino que alcanzará con SQLAlchemy es no saber exactamente cuándo se realizará una llamada de bloqueo. Por supuesto, siempre puedes hacer una inmersión profunda en el código para descubrir cuándo, por mi instinto, dice que va a ser mucho trabajo. – kuhnza
@Kahunza Después de echar un vistazo rápido a los documentos para psycopg2, parece que hay un argumento que se puede incluir en la cadena de conexión que se pasa a la función 'create_engine()' de SQLAlchemy. Tal vez uno de los mantenedores se acercará o lo haré en su lista. ¡Aclamaciones! – Matty
Sin la ayuda de greenlet, la respuesta es no, en el contexto de asyncio.
Sin embargo, es posible usar solo una parte de SQLAlchemy en asyncio. Encontrará un ejemplo en el GINO project, donde solo usamos el núcleo de SQLAlchemy sin motor y el contexto de ejecución completo para crear un ORM simple en asyncio.
- 1. ¿Cómo cambio un socket TCP para que no sea bloqueante?
- 2. ¿Se puede leer un archivo regularmente de IO no bloqueante?
- 3. ¿Configurar nodo para que sea visible externamente?
- 4. No se puede configurar pyqt
- 5. ¿Se puede configurar Hudson para que construya todas las revisiones?
- 6. Twisted: Haciendo código no bloqueante
- 7. No se puede configurar JPA con ehcache
- 8. No se puede configurar el correo para Elmah
- 9. ruby línea no bloqueante leer
- 10. ¿Se puede usar scala splat para cualquier cosa que no sea varargs?
- 11. No se puede configurar gcc - mpfr no encontrado
- 12. ¿Se puede configurar el estado 'git' para que no proporcione texto de ayuda?
- 13. ¿Se puede configurar gcc para que no imprima una ruta completa en mensajes de advertencia/error?
- 14. Cómo configurar compilador de Java que no sea eclipse para Eclipse IDE
- 15. ¿Cómo se puede hacer que una matriz multidimensional sea única?
- 16. ¿Puedo configurar el cuadro de texto para que sea de solo lectura cuando se usa Html.TextBoxFor?
- 17. Haciendo que WCF sea más fácil de configurar
- 18. SQLAlchemy ForeignKey no puede encontrar la tabla
- 19. ¿Puede sugerir un editor web WYSIWYG que no sea HTML?
- 20. Configurar Apache para escuchar en un puerto que no sea 80
- 21. ¿qué puede hacer que pdb.set_trace() sea ignorado?
- 22. SQLAlchemy y se une, que no tienen las claves externas
- 23. ¿Se puede usar Django para aplicaciones que no sean web?
- 24. ¿Se puede configurar ClickOnce para eliminar directorios antiguos publicados?
- 25. ¿Se puede configurar el registrador Ruby estándar para que se descargue después de cada mensaje?
- 26. ¿Se puede configurar Spotlight de Mac OS X para que ignore ciertos tipos de archivos?
- 27. Android Bluetooth tutorial toma para la comunicación no bloqueante
- 28. ¿Se puede configurar Eclipse para evitar que aparezcan ciertas advertencias en el panel de vista Problemas?
- 29. No se puede configurar el volumen en BlackBerry Playbook
- 30. No se puede configurar Android con Ubuntu 11.10
Respuesta corta, no. Son las bibliotecas de bases de datos las que bloquean, no SQLalchemy en sí. Sin embargo, nada le impide hacer cosas de DB en un hilo separado. – AdamKG
@AdamKG Esto probablemente debería ser una respuesta, ¡no un comentario! :-) – Matty