SQLAlchemy ORM:在线程之间安全地传递对象而无需手动重新附加?

时间:2014-11-28 17:57:15

标签: python multithreading sqlalchemy

我正在使用SQLAlchemy ORM的多线程应用程序。它已经使用scoped_session作为其作用域,但是当我们将ORM对象从工作线程传递回主线程时,我们遇到了一些问题。由于对象附加到工作线程的会话,因此当工作线程关闭时,我们开始在这些对象上获取DetachedInstanceErrors。

有没有办法我可以根据需要一般告诉ORM对象将自己分离/重新连接到正确的会话?每当我们操作速度慢而不想锁定我们的UI时,我们就会生成一个新线程,因此将重新连接代码放在我们生成新线程的所有位置都会很麻烦。

我认为我们还需要能够在生成线程时克隆ORM对象,这样我们就可以在主线程中有一个,在工作线程中有一个。我看到"合并"但没有"分裂"。这可能吗?

1 个答案:

答案 0 :(得分:3)

Session.merge()就足够了,应该做你以后做的事情,但即使这样,它也会变得非常繁琐。你可能想重新考虑一下。

将主键传递给worker而不是对象,然后处理对象加载和worker本身的实际工作。没有搞乱线程和打开/关闭会话,最终会导致头痛。一旦工人可以单独处理这些对象,你甚至可以将工人移动到一个单独的过程(类似于Celery所做的那样)。