延迟的Celery任务中的SQLAlchemy会话处理

时间:2011-11-07 08:15:33

标签: session sqlalchemy task celery

我通过SQLAlchemy使用关系数据库。我想使用Celery生成一个处理数据库的工作。有一个代码:

from sqlalchemy.orm.session import Session
from celery.task import task
from myapp.user import User

@task
def job(user):
    # job...
    session = Session.object_session(user)
    with user.begin():
        user.value = result_value

def ordinary_web_request_handler(uid):
    assert isinstance(session, Session)
    user = session.query(User).get(int(uid))
    # deals with user...
    job.delay(user)
    return response

我需要在延迟job中使用SQLAlchemy会话,但还没有session。如何将会话设置为传递user实体?

我想到了一些方法,但我不确定这些中的哪一个(或者没有一个)是最佳实践:

  • 始终只传递主键并通过传递的主键检索新实例。
  • 设置传递的实例的会话(但我不知道如何)。
  • 请勿在延迟任务中使用ORM。

1 个答案:

答案 0 :(得分:1)

您应该能够使用工作人员信号启动会话:http://celery.readthedocs.org/en/latest/userguide/signals.html#worker-signals

如果你使用类似单身的模式来确保你在该线程中总是有一个会话,那么一切都应该可以正常工作。