python - back_populates - sqlalchemy relationship example
Uso de subprocesos mĂșltiples de SQLAlchemy (1)
Los objetos de sesión no son seguros para subprocesos, pero son locales de subprocesos . De los documentos:
"El objeto
Session
está diseñado por completo para ser utilizado de forma no concurrente , lo que en términos de multihilo significa" solo en un hilo a la vez "... algún proceso debe estar en su lugar de modo tal que las múltiples llamadas a través de muchos hilos no En realidad, manejamos la misma sesión. Llamamos a esta noción el almacenamiento local de subprocesos ".
Si no desea hacer el trabajo de administrar hilos y sesiones usted mismo, SQLAlchemy tiene el objeto ScopedSession
para encargarse de esto:
El objeto
ScopedSession
utiliza de forma predeterminada [threading.local ()] como almacenamiento, de modo que se mantiene una solaSession
para todos los que invocan el registroScopedSession
, pero solo dentro del alcance de un solo hilo. Las personas que llaman que llaman al registro en un subproceso diferente obtienen una instancia de sesión que es local para ese otro subproceso.Con esta técnica,
ScopedSession
proporciona una forma rápida y relativamente simple de proporcionar un único objeto global en una aplicación que es segura para ser invocada desde múltiples hilos.
Consulte los ejemplos en Sesiones contextuales / subprocesos locales para configurar sus propias sesiones seguras para subprocesos:
# set up a scoped_session
from sqlalchemy.orm import scoped_session
from sqlalchemy.orm import sessionmaker
session_factory = sessionmaker(bind=some_engine)
Session = scoped_session(session_factory)
# now all calls to Session() will create a thread-local session
some_session = Session()
# you can now use some_session to run multiple queries, etc.
# remember to close it when you''re finished!
Session.remove()
Quiero hacer una interfaz de programación de aplicaciones de base de datos escrita en Python y usar SQLAlchemy (o cualquier otro conector de base de datos si se dice que usar SQLAlchemy para este tipo de tarea no es la mejor manera de hacerlo). La configuración es un servidor MySQL que se ejecuta en Linux o BSD y un software de Python que se ejecuta en una máquina Linux o BSD (ya sea extranjera o local).
Básicamente, lo que quiero hacer es generar un nuevo hilo para cada conexión y el protocolo sería personalizado y bastante simple, aunque para cada solicitud me gustaría abrir una nueva transacción (o sesión como lo he leído) y luego tengo que comprometer La sesión. El problema que estoy enfrentando ahora es que hay una gran probabilidad de que ocurran otras sesiones al mismo tiempo desde otra conexión.
Mi pregunta aquí es ¿qué debo hacer para manejar esta situación?
- ¿Debo usar un candado para que solo una sesión se pueda ejecutar al mismo tiempo?
- ¿Las sesiones son realmente seguras para subprocesos y estoy equivocado al pensar que no lo son?
- ¿Hay una mejor manera de manejar esta situación?
- ¿Está subiendo el camino por el que no se debe ir?