我坚持使用这个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
提供某种副本?
提前致谢!
答案 0 :(得分:2)
某种帖子的副本?
因为 实际上是一个副本 - 当创建新线程时,updater
变量被复制到新线程的堆中的另一个内存区域。以这种方式共享数据库连接可能是一个坏主意。