我发现很难理解在Celery中处理会话的正确方法,可能是因为我不太了解它。
假设我的 celery.py 定义如下:
celery.py
from __future__ import absolute_import
from celery import Celery
from sqlalchemy import create_engine
from sqlalchemy.orm import (
scoped_session,
sessionmaker,
)
DBSession = scoped_session(sessionmaker())
from celery.signals import worker_init
@worker_init.connect
def bootstrap(signal, sender):
engine = create_engine('postgresql://hello:world@localhost/db')
DBSession.configure(bind=engine)
celery = Celery(include=[
'tasks',
])
celery.config_from_object('celeryconfig')
celery.settings=None
if __name__ == '__main__':
celery.start()
我不确定是否应该使用scoped_session,我已经看到了一些使用它的样本,但我认为Celery与范围无关?
问题1:我应该使用哪种会话?
问题2:我应该使用siginal worker_init吗?或者只使用模块级会话?
创建会话后,我们如何实际发布/删除/关闭它?
tasks.py
from .celery import celery, DBSession
@celery.task
def do_task():
DBSession.query(some_object).all()
#some logics
DBSession.commit()
DBSession.remove()
scoped_session会影响使用哪个函数吗?
非常感谢任何帮助。提前谢谢。