正确地使用sqlalchemy进行线程化?

时间:2013-05-19 00:41:01

标签: python multithreading sqlalchemy

我有一个多线程应用程序,其中踏板处理使用sqlalchemy获取的一些对象。这些对象放在一个线程队列中,线程从这个队列中进行轮询。

在主线程中我这样做:

feeds = db_session.query(Feed).filter(Feed.last_checked <= int(update_time)).all()
for feed in feeds:
    self.feed_q.put(feed)

在线程中,我对feed对象进行了一些更新,并且在进行更新时有时会一直得到这些异常:

ProgrammingError: (ProgrammingError) (2014, "Commands out of sync; you can't run this command now") 
StatementError: Can't reconnect until invalid transaction is rolled back (original cause: InvalidRequestError: Can't reconnect until invalid transaction is rolled back)

我知道这与共享相同数据库会话的线程有一些共同点,但我不知道如何解决这个问题。

1 个答案:

答案 0 :(得分:1)

每个线程都应该有一个单独的数据库会话。您可能正在创建最终存储在db_session某处的对象,可能是这样的:

db_session = Session()

基本上,您需要每个线程都有自己的db_session