SqlAlchemy和多进程处理

9
我使用SqlAlchemy连接到我的数据库后端,并在我的Python应用程序中大量使用多进程。我遇到了一个需要将一个数据库查询结果的对象引用从一个进程传递到另一个进程的情况。
这是一个问题,因为当访问对象的属性时,SqlAlchemy会尝试将对象重新附加到其他进程的当前会话中,但由于对象已经在其他会话中被附加,所以会导致失败并抛出异常。
InvalidRequestError: Object '<Field at 0x9af3e4c>' is already attached to session '148848780' (this is '159831148')

如何处理这种情况?是否有可能从第一个会话中分离对象或克隆对象而不涉及ORM相关的内容?


2
只是一个建议:您尝试将对象合并到新会话中了吗?http://www.sqlalchemy.org/docs/orm/session.html#merging - Maxim Sloyko
session.expunge(obj) 会让 sqlalchemy 忘记 obj。但是,如果之后更改 obj,则更改不再提交到数据库中。maksymko 的建议肯定更好。 - Simon
这个对象上的属性是否是另一个存储在数据库中的对象?例如,它是一个外键还是一个 BLOB? - Ken Kinder
“合并”对我来说看起来不错,我会试一下。我只需要读取属性,这些属性是整数和字符串。 - Manuel Faux
1个回答

15

这是一个糟糕的想法(商标)。

不应该像这样在进程之间共享有状态的对象(我知道这很诱人),因为锁原语不打算在多个Python运行时中工作,所以可能会发生各种各样的问题。

建议从该对象中提取所需的属性,将它们插入到字典中,并使用多处理Pipes将其传递给其他进程:

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


我只需要对这些对象进行读取访问。你认为从其他进程的对象中读取甚至会很混乱吗? - Manuel Faux
是的,因为您无法百分之百确定对象的行为会是什么。 - Rafael Ferreira
听起来很合理。谢谢! - Manuel Faux

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接