我使用SqlAlchemy连接到我的数据库后端,并在我的Python应用程序中大量使用多处理。我遇到了一种情况,需要将对象引用(这是数据库查询的结果)从一个进程传递到另一个进程。
这是一个问题,因为在访问对象的属性时,SqlAlchemy尝试将对象重新附加到另一个进程的当前会话中,该进程因异常而失败,因为该对象附加在另一个会话中:
InvalidRequestError: Object '<Field at 0x9af3e4c>' is already attached to session '148848780' (this is '159831148')
处理这种情况的方法是什么?是否可以从第一个会话中分离对象或克隆没有ORM相关内容的对象?
答案 0 :(得分:14)
这是一个坏主意(tm)。
你不应该在这样的进程之间共享一个有状态对象(我知道这很诱人)因为各种不好的事情都可能发生,因为锁原语并不适用于多个python运行时。
我建议从那个对象中取出你需要的属性,将它们塞进一个字典中 使用多处理管道将其发送到进程:
http://docs.python.org/library/multiprocessing.html#pipes-and-queues