2011-01-13 2 views
8

Ich benutze SqlAlchemy, um eine Verbindung zu meinem Datenbank-Backend herzustellen und in meiner Python-Anwendung intensiv Multiprocessing zu verwenden. Ich kam zu einer Situation, die es erfordert, eine Objektreferenz, die das Ergebnis einer Datenbankabfrage ist, von einem Prozess zu einem anderen zu übergeben.SqlAlchemy und Multiprocessing

Dies ist ein Problem, weil, wenn ein Attribut des Objekts zugreifen, sqlalchemy das Objekt in die aktuelle Sitzung des anderen Prozesses wieder zu befestigen trys, die mit einer Ausnahme fehlschlägt, weil das Objekt in einer anderen Sitzung gebunden ist:

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

Wie geht man mit dieser Situation um? Ist es möglich, das Objekt von der ersten Sitzung zu trennen oder das Objekt ohne das ORM-verwandte Objekt zu klonen?

+2

nur ein Vorschlag: Haben Sie versucht, verschmelzenden das Objekt in die neue Sitzung? http://www.sqlalchemy.org/docs/orm/session.html#merging –

+0

session.expunge (obj) macht sqlalchemy vergessen obj. Wenn Sie jedoch später obj ändern, werden Änderungen nicht mehr an die Datenbank übergeben. Maksymkos Vorschlag ist sicherlich besser. – Simon

+0

Ist das Attribut auf dem Objekt ein anderes Datenbankobjekt? Zum Beispiel ist es ein Fremdschlüssel oder ein Blob? –

Antwort

13

Dies ist eine schlechte Idee (tm).

Sie sollten kein statusbehaftetes Objekt zwischen Prozessen wie diesem freigeben (ich weiß, dass es verlockend ist), da alle möglichen schlechten Dinge passieren können, da Sperr-Primitive nicht für mehrere Python-Laufzeiten geeignet sind.

Ich schlage vor, die Attribute nehmen Sie aus diesem Objekt benötigen, um sie in einem dict Jamming und es über Prozesse zu senden mit multprocessing Pipes:

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

+0

Ich brauche nur Lesezugriff auf diese Objekte. Denkst du, dass selbst das Lesen von Objekten anderer Prozesse unordentlich ist? –

+0

Ja, weil Sie nicht 100% ig sicher sein können, wie das Objekt verhalten würde –

+0

Klingt vernünftig. Vielen Dank! –