Sqlalchemy scoped_session和“已经附加”错误

时间:2016-05-06 14:32:57

标签: python multithreading sqlalchemy

我在这里的第一篇文章。我正在尝试多线程以前的单线程数据库应用程序(postgresql,python2.7,sqlalchemy)。

我已按照在线说明操作并更改了会话处理程序,如下所示。这是在启动任何worker之前在控制线程中完成的:

config.engine = create_engine("postgresql://foo:foobar@localhost/foo", echo=False)
config.session_factory = sessionmaker(bind=config.engine)
config.Session = scoped_session(config.session_factory)

我从其他线程获得的错误消息是这样的。当线程启动时,它会创建一个范围会话的新实例,并尝试将从控制线程收到的对象(self.channel)添加到其会话上下文中:

self.session = config.Session()
self.session.add(self.channel)

我从工作线程获得的错误是:

InvalidRequestError: Object '<YChannel at 0x7ff3bab09490>' is already attached to session '1' (this is '3')

我做错了什么?这些是我的会话不是一个范围会话时得到的错误,但我从文档中了解到,一旦切换到范围会话,这些就会消失。

理查德

1 个答案:

答案 0 :(得分:0)

正如评论中的 universo 所说,您正在尝试在多个会话/线程之间共享对象。您的频道对象是在主线程中创建的。当您启动执行程序时,第1个主题会创建一个新会话,并将频道对象添加到其会话中。现在,当执行线程2 时,它会创建自己的会话并尝试再次将频道对象添加到其会话中。由于无法跨会话共享对象,因此会出现异常。

要解决这个问题,这实际上取决于你想要达到的目标。如果您只有一个频道对象,为什么要使用多个线程和会话。如果有多个通道对象,您可以考虑在线程本身中创建对象。