2011-01-13 11 views
8

Używam SqlAlchemy do łączenia się z moim zapleczem bazy danych i intensywnego korzystania z wieloprocesowości w mojej aplikacji Python. Doszedłem do sytuacji, która wymaga przekazania referencji do obiektu, która jest wynikiem zapytania do bazy danych, z jednego procesu do drugiego.SqlAlchemy and Multiprocessing

Jest to problem, ponieważ podczas uzyskiwania dostępu do atrybutu obiektu, SqlAlchemy próbuje ponownie dołączyć obiekt do bieżącej sesji innego procesu, który kończy się niepowodzeniem z wyjątkiem, ponieważ obiekt jest dołączony do innej sesji:

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

Jaki jest sposób poradzenia sobie z taką sytuacją? Czy możliwe jest odłączenie obiektu od pierwszej sesji lub sklonowanie obiektu bez obiektów związanych z ORM?

+2

tylko sugestia: Czy próbowałeś łączących obiekt w nowa sesja? http://www.sqlalchemy.org/docs/orm/session.html#merging –

+0

session.expunge (obj) powoduje, że sqlalchemy zapomina o obj. Jednakże, jeśli później zmienisz obiekt, zmiany nie będą już wprowadzane do bazy danych. sugestia maksymko jest z pewnością lepsza. – Simon

+0

Czy atrybut na obiekcie inny obiekt zapisany w bazie danych? Na przykład czy jest to klucz obcy czy obiekt typu blob? –

Odpowiedz

13

To jest zły pomysł (tm).

Nie należy udostępniać obiektu stanowego między procesami takimi jak ten (wiem, że to kuszące), ponieważ mogą wystąpić wszystkie złe rzeczy, ponieważ prymitywy blokujące nie są przeznaczone do pracy w wielu środowiskach pythona.

Proponuję biorąc atrybuty potrzebne z tego obiektu, zagłuszania ich do dict i wysłaniem go między procesami za pomocą multprocessing Rury

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

+0

Potrzebuję tylko dostępu do odczytu dla tych obiektów. Czy myślisz, że nawet czytanie z przedmiotów innych procesów jest nieporządne? –

+0

Tak, ponieważ nie można być w 100% pewnym, jakie zachowanie obiektu będzie miało –

+0

Brzmi rozsądnie. Dziękuję Ci! –

Powiązane problemy