2012-02-04 48 views
3

我坚持用这个的SQLAlchemy的Python问题:说完之后这里的应该在多线程会员在__init)初始化__(和其他方法的工作方式不同

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) 

做简单的更新作业的一类,但没有真正的更改提交到数据库。它的工作原理,如果我移动 成员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的某种副本?

在此先感谢!

回答

2

某种形式的帖子副本?

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

+0

好的,这说明了情况。想想如何使它可用,谢谢! – yablokoff 2012-02-04 20:54:44