2011-01-13 4 views
8

Я использую SqlAlchemy для подключения к моей базе данных базы данных и интенсивно использую многопроцессорность в моем приложении Python. Я пришел к ситуации, которая требует передать ссылку на объект, которая является результатом запроса базы данных, из одного процесса в другой.SqlAlchemy and Multiprocessing

Это проблема, поскольку при доступе к атрибуту объекта SqlAlchemy пытается повторно привязать объект к текущему сеансу другого процесса, который не работает с исключением, поскольку объект привязан в другом сеансе:

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

Как можно справиться с этой ситуацией? Можно ли отделить объект от первого сеанса или клонировать объект без связанных с ORM материалов?

+2

Только предложение: вы пробовали слияния объекта в новой сессии? http://www.sqlalchemy.org/docs/orm/session.html#merging –

+0

session.expunge (obj) заставляет sqlalchemy забыть об объекте. Однако, если вы измените obj впоследствии, изменения больше не будут переданы в базу данных. предложение максимко, безусловно, лучше. – Simon

+0

Является ли атрибутом на объекте другой хранимый объект базы данных? Например, это внешний ключ или blob? –

ответ

13

Это плохая идея (tm).

Вы не должны делиться объектами с сохранением состояния между процессами, подобными этому (я знаю, что это заманчиво), потому что могут возникать всевозможные плохие вещи, поскольку примитивы-блокировки не предназначены для работы в течение нескольких сеансов python.

Я предлагаю принимать атрибуты, которые необходимы из этого объекта, заклинивание их в Словарь и отправка его через процессы, используя multprocessing трубы:

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

+0

Мне нужен только доступ на чтение на этих объектах. Вы думаете, что даже чтение из объектов других процессов беспорядочно? –

+0

Да, потому что вы не можете быть на 100% уверены, что поведение объекта будет –

+0

Звучит разумно. Спасибо! –