SqlAlchemy与多进程

9 投票
1 回答
8338 浏览
提问于 2025-04-16 09:54

我在用SqlAlchemy连接我的数据库,并在Python应用中大量使用多进程。最近遇到了一个问题,我需要把一个对象引用(这个对象是数据库查询的结果)从一个进程传递到另一个进程。

这个问题在于,当我试图访问这个对象的某个属性时,SqlAlchemy会尝试把这个对象重新连接到另一个进程的当前会话中,但这会失败,出现异常,因为这个对象已经在另一个会话中被连接了:

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

那么,应该如何处理这种情况呢?有没有办法把这个对象从第一个会话中分离出来,或者在不涉及ORM的情况下克隆这个对象呢?

1 个回答

15

这样做是个坏主意(tm)。

你不应该在不同的进程之间共享一个有状态的对象(我知道这样做很诱人),因为这样会引发各种问题,因为锁的机制并不适合在多个Python运行环境中使用。

我建议把你需要的属性从那个对象中提取出来,放进一个字典里,然后通过多进程的管道(Pipes)发送到其他进程:

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

撰写回答