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

Python SQLAlchemy ORM:在线程之间安全地传递对象而无需手动重新连接?,python,multithreading,sqlalchemy,Python,Multithreading,Sqlalchemy,我正在开发一个使用SQLAlchemy ORM的多线程应用程序。它已经使用了作用域_会话,并将线程作为其作用域,但当我们将ORM对象从工作线程传递回主线程时,出现了一些问题。由于对象已附加到工作线程的会话,因此当工作线程关闭时,这些对象上会出现DetachedInstanceErrors 有没有一种方法可以让ORM对象根据需要分离/重新连接到正确的会话?每当我们有一个缓慢的操作,我们不想锁定我们的UI时,我们就会产生一个新的线程,所以在我们产生一个新线程的地方放置重新附加代码将是一个混乱 我认为

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

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

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

Session.merge就足够了,它应该做您想要做的事情,但即使这样,它也会对线程进行处理。你可能想重新考虑一下

将主键而不是对象传递给工作者,然后在工作者本身中处理对象加载和实际工作。不要乱搞线程和开/闭会话,这最终会导致头痛。一旦辅助进程可以单独处理对象,您甚至可以将辅助进程移动到与芹菜类似的单独进程中。

Session.merge就足够了,应该做您想要做的事情,但即使这样,它也会处理线程。你可能想重新考虑一下


将主键而不是对象传递给工作者,然后在工作者本身中处理对象加载和实际工作。不要乱搞线程和开/闭会话,这最终会导致头痛。一旦工作人员可以单独处理对象,您甚至可以将工作人员移动到与芹菜类似的单独流程。

谢谢,看起来我在查看merge时误读了merge实际合并的内容。我们希望尽可能地使用对象本身,而不是传递ID,主要是为了代码整洁和更少的DB命中。如果这太复杂了,我们肯定会把它作为B计划记在心里,因为它要简单得多。我们不想将所有的工作人员转移到单独的流程上,因为我们的项目是另一个软件的第三方插件。我们可以从不同的线程向它发送信号,但不是从不同的进程。谢谢,看起来我在看merge时误读了merge实际上是在合并什么。我们希望尽可能地使用对象本身,而不是传递ID,主要是为了代码整洁和更少的DB命中。如果这太复杂了,我们肯定会把它作为B计划记在心里,因为它要简单得多。我们不想将所有的工作人员转移到单独的流程上,因为我们的项目是另一个软件的第三方插件。我们可以从不同的线程向它发送信号,但不能从不同的进程发送。