2012-02-04 21 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