2011-01-13 14 views
8

Uso SqlAlchemy para conectarme a mi base de datos backend y hacer uso intensivo del multiproceso en mi aplicación Python. Llegué a una situación que requiere pasar una referencia de objeto, que es el resultado de una consulta de base de datos, de un proceso a otro.SqlAlchemy y multiprocesamiento

Esto es un problema, porque al acceder a un atributo del objeto, SqlAlchemy intenta volver a conectar el objeto en la sesión actual del otro proceso, que falla con una excepción, porque el objeto se adjunta en otra sesión:

InvalidRequestError: Object '<Field at 0x9af3e4c>' is already attached to session '148848780' (this is '159831148') 

¿Cuál es la manera de manejar esta situación? ¿Es posible separar el objeto de la primera sesión o clonar el objeto sin las cosas relacionadas con ORM?

+2

Sólo una sugerencia: ¿Ha intentado fusionar el objeto en la nueva sesión? http://www.sqlalchemy.org/docs/orm/session.html#merging –

+0

session.expunge (obj) hace que sqlalchemy se olvide de obj. Sin embargo, si cambia obj después, los cambios ya no están comprometidos con la base de datos. La sugerencia de maksymko es ciertamente mejor. – Simon

+0

¿El atributo en el objeto es otro objeto almacenado de la base de datos? Por ejemplo, ¿es una clave foránea o un blob? –

Respuesta

13

Esta es una mala idea (tm).

No debe compartir un objeto con estado entre procesos como este (sé que es tentador) porque pueden ocurrir todo tipo de problemas ya que las primitivas de bloqueo no están pensadas para funcionar en múltiples tiempos de ejecución de Python.

sugiero tomar los atributos que necesita salir de ese objeto, atascos de ellos en un diccionario y enviarlos a través de procesos utilizando canalizaciones multprocessing:

http://docs.python.org/library/multiprocessing.html#pipes-and-queues

+0

Solo necesito acceso de lectura en estos objetos. ¿Crees que incluso la lectura de objetos de otros procesos es desordenada? –

+0

Sí, porque no puede estar 100% seguro de cuál sería el comportamiento del objeto –

+0

Parece razonable. ¡Gracias! –