全部。我用Flask App设置了芹菜,我有一个问题芹菜如何管理sqlalchemy会话。假设我这样做我的celery应用程序(使用此snippet):
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()
现在在Flask App的主view.py中添加一个路径
@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()
答案 0 :(得分:0)
您在哪里创建并保留SQLAlchemy Engine对象?引擎处理连接池 - 如果您每次创建会话时都创建引擎,则可能会有一组引擎,每个引擎都保留在一个会话的“池”中。