2014-11-28 2 views
1

Я работаю над многопоточным приложением, использующим ORM SQLAlchemy. Он уже использует scoped_session с потоком в качестве области действия, но у нас возникают некоторые проблемы, когда мы передаем объект ORM из рабочего потока обратно в основной поток. Поскольку объекты привязаны к сеансу рабочего потока, когда рабочий поток отключается, мы начинаем получать DetachedInstanceErrors на этих объектах.SQLAlchemy ORM: безопасная передача объектов между потоками без ручной перезагрузки?

Есть ли способ, который я могу в общих чертах рассказать объектам ORM, чтобы отсоединить/снова подключиться к правильной сессии по мере необходимости? Мы создаем новый поток всякий раз, когда у нас медленная работа, мы не хотим блокировать наш пользовательский интерфейс, поэтому размещение кода повторной привязки везде, где мы создаем новый поток, будет бесполезным.

Я думаю, что мы также должны иметь возможность клонировать объект ORM, когда мы создаем поток, чтобы мы могли иметь один в основном потоке и один в рабочем потоке. Я вижу «слияние», но не «раскол». Это возможно?

ответ

2

Session.merge() достаточно и должен делать то, что вам нужно, но даже тогда он становится неудобным с потоками. Возможно, вы захотите переосмыслить это.

Передайте первичный ключ (ы) работнику вместо объектов, а затем обработайте загрузку объекта и фактическую работу самого работника. Не возиться с потоками и открытыми/закрытыми сеансами, что в конечном итоге приведет к головной боли. Как только работники могут иметь дело с объектами отдельно, вы можете даже переместить рабочих в отдельный процесс (как это делает сельдерей).

+0

Спасибо, похоже, я неправильно понял, что «слияние» на самом деле слилось, когда я смотрел на него. Мы хотим попытаться использовать сами объекты везде, где это возможно, а не передавать идентификаторы, в основном для чистоты кода и меньше ударов БД. Мы определенно будем иметь в виду, как план B, если это слишком сложно, потому что это намного проще. Мы не хотели бы переводить всех наших сотрудников на отдельные процессы, потому что наш проект является сторонним плагином для другого программного обеспечения. Мы можем отправлять сигналы обратно из другого потока, но не с другим процессом. – mmitchell

Смежные вопросы