Все. Я настроил сельдерей с помощью своего приложения Flask, и у меня есть вопрос, как сельдерей управляет сеансом sqlalchemy. Скажем, я запускаю свое приложение celery, делая это (используя этот фрагмент):
celery = make_celery(app)
#set up a test task
@celery.task(name='testcelery', ignore_result=True)
def test_celery():
db_session.execute("""INSERT INTO [dbo].[testconstraint]
VALUES (1)
""")
db_session.commit()
Теперь в моем main view.py из приложения Flask добавьте маршрут
@app.route('/testcelery', methods=['GET'])
def testcelery():
tasks.test_celery.apply_async()
return 'just test'
Все работает нормально, за исключением того, что каждый раз, когда я нажимаю /testcelery, он инициирует сеанс (я использую MS SQL SERVER) и не закрывает/удаляет его (если только я не использую KeyInterupt celery из командной строки). Это добавляет много сессий в Activity Monitor.
Каждый из них показывает так:
Я тестировал добавление db_session.close()
или db_session.remove()
в конце этой задачи сельдерея, но все еще не работает. Кто-нибудь знает, в чем может быть причина?
РЕДАКТИРОВАТЬ: вот мой движок и создание сеанса в database.py
engine = create_engine('connection string')
db_session = scoped_session(sessionmaker(autocommit=False, autoflush=False, bind=engine))
Base = declarative_base()
Base.query = db_session.query_property()
database.py
. Я добавил фрагмент кода в op. А соединения с базой данных создаются из другого кода, выполняяfrom .database import db_session
. Это правильный способ сделать? 09.12.2014