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

mmi*_*ell 2 python multithreading sqlalchemy

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

有没有一种方法可以一般地告诉 ORM 对象根据需要将自己分离/重新连接到正确的会话?每当我们有一个我们不想锁定我们的 UI 的缓慢操作时,我们就会产生一个新线程,所以将重新附加代码放在我们产生新线程的任何地方都会是一团糟。

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

tuo*_*mur 5

Session.merge()就足够了,应该做你想做的事,但即便如此,它也会对线程感到厌烦。您可能需要重新考虑这一点。

将主键传递给工作人员而不是对象,然后处理对象加载和工作人员本身的实际工作。不要搞乱线程和打开/关闭会话,这最终会导致头痛。一旦工作人员可以分别处理对象,您甚至可以将工作人员移至单独的进程(类似于 Celery 所做的)。