【问题标题】:SqlAlchemy and MultiprocessingSqlAlchemy 和多处理
【发布时间】:2011-01-13 12:59:22
【问题描述】:

我使用 SqlAlchemy 连接到我的数据库后端,并在我的 Python 应用程序中大量使用多处理。我遇到了一种情况,需要将对象引用(数据库查询的结果)从一个进程传递到另一个进程。

这是一个问题,因为在访问对象的某个属性时,SqlAlchemy 尝试将该对象重新附加到另一个进程的当前会话中,但失败并出现异常,因为该对象附加在另一个会话中:

InvalidRequestError: Object '<Field at 0x9af3e4c>' is already attached to session '148848780' (this is '159831148')

如何处理这种情况?是否可以在没有 ORM 相关内容的情况下从第一个会话中分离对象或克隆对象?

【问题讨论】:

  • 只是一个建议:您是否尝试过将对象合并到新会话中? sqlalchemy.org/docs/orm/session.html#merging
  • session.expunge(obj) 让 sqlalchemy 忘记了 obj。但是,如果您之后更改 obj,则更改不会再提交到数据库。 maksymko 的建议当然更好。
  • 对象上的属性是另一个数据库存储的对象吗?例如,它是外键还是 blob?
  • ''merge'' 对我来说看起来不错,我会试试这个。我只需要读取属性,它们是 int 和 str。

标签: python orm sqlalchemy multiprocessing


【解决方案1】:

这是一个坏主意(tm)。

您不应该在这样的进程之间共享一个有状态的对象(我知道这很诱人),因为锁原语不适合跨多个 python 运行时工作,因此可能会发生各种坏事。

我建议从那个对象中取出你需要的属性,把它们塞进一个字典中,然后 使用多处理管道跨进程发送:

http://docs.python.org/library/multiprocessing.html#pipes-and-queues

【讨论】:

  • 我只需要这些对象的读取权限。您是否认为即使从其他进程的对象中读取也很混乱?
  • 是的,因为您不能 100% 确定对象的行为是什么
  • 听起来很合理。谢谢!
猜你喜欢
  • 2020-01-15
  • 1970-01-01
  • 1970-01-01
  • 2013-11-05
  • 2021-04-04
  • 2021-09-24
  • 1970-01-01
  • 2018-05-01
  • 1970-01-01
相关资源
最近更新 更多