2011-01-13 11 views
8

SqlAlchemy를 사용하여 데이터베이스 백엔드에 연결하고 Python 응용 프로그램에서 다중 처리를 많이 사용합니다. 하나의 프로세스에서 다른 프로세스로 데이터베이스 쿼리의 결과 인 객체 참조를 전달해야하는 상황이 발생했습니다.SqlAlchemy 및 다중 처리

개체의 특성에 액세스 할 때 SqlAlchemy가 개체가 다른 세션에 연결되어 있기 때문에 예외가 발생하여 다른 프로세스의 현재 세션에 개체를 다시 연결하려고하면이 문제가 발생합니다.

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

이 상황을 처리하는 방법은 무엇입니까? ORM 관련 내용없이 첫 번째 세션에서 개체를 분리하거나 개체를 복제 할 수 있습니까?

+2

:

내가 딕셔너리로 ​​움직이지 않게, 그 객체에서 필요로하는 특성을 가지고 제안하고 는 multprocessing 된 파이프를 사용하여 프로세스를 통해 그것을 전송 한 당신에 객체를 병합 시도 새로운 세션? http://www.sqlalchemy.org/docs/orm/session.html#merging –

+0

session.expunge (obj)는 sqlalchemy가 obj를 잊어 버리게 만듭니다. 그러나 나중에 obj를 변경하면 더 이상 데이터베이스에 변경 사항이 커밋되지 않습니다. maksymko의 제안은 확실히 좋습니다. – Simon

+0

개체의 속성이 다른 데이터베이스에 저장된 개체입니까? 예를 들어 외래 키 또는 얼룩 (blob)입니까? –

답변

13

이것은 좋은 아이디어입니다 (tm).

lock primitives는 여러 개의 Python 런타임에서 작동하지 않으므로 모든 종류의 문제가 발생할 수 있기 때문에 이와 같은 프로세스간에 상태 저장 객체를 공유하면 안됩니다 (유혹입니다). 그냥 제안을

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

+0

이 객체에 대해서만 읽기 액세스 권한이 필요합니다. 다른 프로세스의 객체를 읽는 것조차 지저분하다고 생각하십니까? –

+0

네, 왜냐하면 당신은 100 % 객체의 행동이 무엇인지 확신 할 수 없기 때문입니다. –

+0

합리적으로 들립니다. 고맙습니다! –