@egregors

Как получить доступ к текущему контексту приложения из нового треда?

Есть класс, принимающий объект, который необходимо добавить на удаление в сессию sqlalchemy.
Если реализовать этот класс в рамках текущего треда, никаких проблем не возникает:

from ..extensions import db
# db = SQLAlchemy()

class Remover(object):
    """docstring for Remover"""
    def __init__(self, obj):
        super(Remover, self).__init__()
        self.obj = obj
        self.remove()

    def remove(self):
        try:
            db.session.delete(self.obj)
            db.session.commit()
        except Exception, e:
            raise e

u = User().query.first()
Remover(u)


Но необходимо сделать, что бы добавление объекта в сессию и commit, происходили не сразу, а через n секунд. Для этого, в новом треде, я создаю таймер, по истечении которого выполняется метод remove()

from threading import Timer
from ..extensions import db
# db = SQLAlchemy()


class Remover(object):
    """docstring for Remover"""
    def __init__(self, obj):
        super(Remover, self).__init__()
        self.obj = obj
        self.t = Timer(7, self.remove)
        self.t.start()

    def remove(self):
        try:
            db.session.delete(self.obj)
            db.session.commit()
        except Exception, e:
            raise e

    def cancel(self):
        self.t.cancel()

u = User().query.first()
Remover(u)


В этом случае выбрасывается исключение:
RuntimeError: application not registered on db instance and no application bound to current context


Подскажите пожалуйста, как правильно работать с контекстами из дополнительных тредов, что бы появилась возможность грамотно реализовать описанный класс?
  • Вопрос задан
  • 2946 просмотров
Пригласить эксперта
Ответы на вопрос 1
@dmtrrr
Backend developer
Если вам нужно реализовать отложенное удаление, то это делается по другому и без потоков.
В вашем случае вам нужно передавать в Remover не ссылку на объект, а id пользователя.
Затем в Remover открывать новый коннект к БД и удалять пользователя с переданным id.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы