python - SQLAlchemy ORM : safely passing objects between threads without manually reattaching?

标签 python multithreading sqlalchemy

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

有没有一种方法可以让 ORM 对象根据需要将自己分离/重新附加到正确的 session ?每当我们有一个缓慢的操作,我们不想锁定我们的 UI 时,我们就会生成一个新线程,因此将重新附加代码放在我们生成新线程的任何地方都会很困惑。

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

最佳答案

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

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

关于python - SQLAlchemy ORM : safely passing objects between threads without manually reattaching?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27193849/

相关文章:

python - 在python中迭代mysql表

python - Esky更新导致事务处理文件操作错误

python - multiprocessing.Process() 或 multiprocessing.Pool() 会更均匀地分布在核心之间吗?

python - 处理 SQLAlchemy 断开连接

count - 在 SQLAlchemy 中优化具有多个计数的左连接查询?

python - 排除连接表中没有关联行的行

python - 为什么循环完成后循环内 print() 会输出?

java - 构造函数中非线程安全集合的突变是否需要同步?

java - 如何从后台线程调用 Java 类

python - 在 CentOS 上找不到 Python.h 文件