【发布时间】:2015-11-07 01:44:40
【问题描述】:
总结:我想在 celery 任务中使用 sqlalchemy 会话,而不需要包含该会话的全局变量。
我在一个带有 celery 任务的项目中使用 SQLAlchemy,我正在使用
目前,我在 celery 应用程序设置 (celery.py) 中定义了一个全局变量“会话”,并带有一个工作信号来设置它。
session = scoped_session(sessionmaker())
@celeryd_init.connect
def configure_workers(sender=None, conf=None, **kwargs):
# load the application configuration
# db_uri = conf['db_uri']
engine = create_engine(db_uri)
session.configure(bind=engine)
在定义任务的模块中,我只需导入“会话”并使用它。任务是使用自定义类定义的,该类在返回后关闭会话:
class DBTask(Task):
def after_return(self, *args, **kwargs):
session.remove()
但效果很好:当使用 CELERY_ALWAYS_EAGER=True 进行单元测试时,不会配置会话。到目前为止,我发现的唯一解决方案是在单元测试中运行任务时模拟“会话”变量:
with mock.patch('celerymodule.tasks.session', self.session):
do_something.delay(...)
虽然它有效,但我不想这样做。
有什么方法可以设置一个不是全局变量的会话,它既适用于正常的异步行为,也适用于没有 CELERY_ALWAYS_EAGER=True 的工作人员?
【问题讨论】:
标签: python sqlalchemy celery