Инициализация члена в __init __ () и других методах работает иначе - PullRequest
3 голосов
/ 04 февраля 2012

Я застрял с этой проблемой 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 Ответ

2 голосов
/ 05 февраля 2012

какая-то копия для поста?

Поскольку на самом деле является копией - при создании нового потока переменная updater копируется в другую область памяти в куче нового потока. Вероятно, это плохая идея для совместного использования db-соединений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...