我正在将Huey与简单的金字塔应用集成在一起。我没有在应用程序中使用全局SQLAlchemy会话(我正在使用最新的炼金术脚手架)。但是,似乎没有其他直接的方法来为周期性任务提供会话。
from huey import RedisHuey
huey = RedisHuey(password=os.environ.get('REDIS_PASSWORD', ''))
DBSession = scoped_session(sessionmaker())
@huey.periodic_task(crontab(minute='*/1'))
def notify_not_confirmed_assignments():
# TODO: Use a non-global DB session
assignments = DBSession.query(Assignment).filter_by(date=next_date).all()
Huey是否提供挂钩以在任务完成时关闭数据库连接?为这些任务提供线程安全连接的最佳方法是什么?
提前致谢!
答案 0 :(得分:1)
您可以在任务中使用工厂构建会话对象:
def identity(n):
m=[[0 for x in range(n)] for y in range(n)]
for i in range(0,n):
m[i][i] = 1
return m
无需使用作用域会话,只需初始化引擎并将其传递给工厂。
答案 1 :(得分:0)
scoped_session
为您提供contextual/thread-local session(即它对应于每个线程中的单个数据库连接,当您需要单独的会话时,也可以configure a custom scope不是一个主题。
所以,基本上,你需要做的就是拥有一个配置正确的伪全局变量(类似于你现在拥有的变量),并确保在任务和DBSession的开头调用DBSession.begin()。最后的commit() - 手动执行该操作可能是一件苦差事,但它可以很容易地抽象到上下文管理器中
def my_task():
with magically_start_session() as session:
session.query(...)
或装饰者:
@huey.periodic_task(crontab(minute='*/1'))
@start_session
def notify_not_confirmed_assignments(session):
# TODO: Use a non-global DB session
assignments = session.query(...)