2011-01-13 18 views
8

Uso SqlAlchemy per connettersi al back-end del mio database e fare un uso intensivo di multiprocessing nella mia applicazione Python. Sono giunto a una situazione che richiede il passaggio di un riferimento a un oggetto, che è il risultato di una query di database, da un processo a un altro.SqlAlchemy e Multiprocessing

Questo è un problema, perché quando si accede a un attributo dell'oggetto, SQLAlchemy trys per riattaccare l'oggetto nella sessione corrente del altro processo, che non riesce con un'eccezione, poiché l'oggetto è attaccato in un'altra sessione:

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

Qual è il modo di gestire questa situazione? È possibile staccare l'oggetto dalla prima sessione o clonare l'oggetto senza la roba relativa all'ORM?

+2

Solo un suggerimento: Hai provato la fusione l'oggetto in la nuova sessione? http://www.sqlalchemy.org/docs/orm/session.html#merging –

+0

session.expunge (obj) rende sqlalchemy dimenticare obj. Tuttavia, se si cambia obj in seguito, le modifiche non vengono più commesse nel database. Il suggerimento di maksymko è sicuramente migliore. – Simon

+0

L'attributo sull'oggetto è un altro oggetto memorizzato nel database? Ad esempio è una chiave straniera o un blob? –

risposta

13

Questa è una cattiva idea (tm).

Non si dovrebbe condividere un oggetto di stato tra processi come questo (so che è allettante) perché possono accadere tutti i tipi di cose cattive poiché i primitivi di blocco non sono destinati a funzionare su più runtime di Python.

suggerisco di prendere gli attributi necessari fuori di tale oggetto, li disturbo in un dict e inviarlo attraverso i processi usando multprocessing Pipes:

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

+0

Ho solo bisogno di accesso in lettura su questi oggetti. Pensi che persino leggere da oggetti di altri processi sia disordinato? –

+0

Sì, perché non si può essere sicuri al 100% quale sia il comportamento dell'oggetto –

+0

Suoni ragionevoli. Grazie! –