成员在__init __()中的初始化和其他方法的工作方式不同

时间:2012-02-04 19:27:01

标签: python sqlalchemy

我坚持使用这个SQLAlchemy-Python问题:这是一个应该在多个线程中执行简单更新工作的类

class InThreadUpdater():
    def __init__(self):
        self.portion_size = 5
        self.select_portion_func = db.session.query(FBPostStats).with_lockmode("update").limit(self.portion_size)

    def run(self):
        for post in self.select_portion_func.all():
            post.locked_by_thread = True
        db.session.commit()

if __name__ == "__main__":
    updater = InThreadUpdater()
    thread = threading.Thread(target=updater.run)

但是在完成之后,db没有真正的改变。如果我移动初始化,它的工作原理 会员select_portion_func可以像这样运作run()

def run(self):
    self.select_portion_func = db.session.query(FBPostStats).with_lockmode("update").limit(self.portion_size)
    for post in self.select_portion_func.all():
        post.locked_by_thread = True
    db.session.commit()

这两种变体有什么区别?为什么第一个为post提供某种副本?

提前致谢!

1 个答案:

答案 0 :(得分:2)

  

某种帖子的副本?

因为 实际上是一个副本 - 当创建新线程时,updater变量被复制到新线程的堆中的另一个内存区域。以这种方式共享数据库连接可能是一个坏主意。