Flask、Celery 和 SQLAlchemy 是构建现代 Web 应用程序的常用工具组合。Flask 是一个轻量级的 Web 框架,Celery 是一个分布式任务队列,而 SQLAlchemy 是一个强大的 SQL 工具包和 ORM(对象关系映射)库。当这三者结合使用时,可能会遇到数据库连接超时的问题。
Flask: 是一个 Python 微框架,用于快速构建 Web 应用程序。 Celery: 是一个异步任务队列/作业队列,用于处理后台任务。 SQLAlchemy: 是一个 SQL 工具包和 ORM 库,提供了全套的企业级持久性模型。
在 Celery 中,可以为任务设置超时时间,防止任务执行时间过长。
from celery import Celery
app = Celery('tasks', broker='redis://localhost:6379/0')
@app.task(bind=True, max_retries=3, default_retry_delay=30)
def my_task(self):
try:
# 任务逻辑
pass
except Exception as exc:
raise self.retry(exc=exc)
SQLAlchemy 提供了连接池功能,可以有效管理数据库连接。
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
engine = create_engine('postgresql://user:password@host/dbname', pool_size=10, max_overflow=20)
Session = sessionmaker(bind=engine)
确保在任务完成后及时关闭数据库连接。
from sqlalchemy.orm import scoped_session, sessionmaker
Session = scoped_session(sessionmaker(bind=engine))
def my_task():
session = Session()
try:
# 任务逻辑
pass
finally:
session.close()
可以在数据库服务器端调整连接超时设置,例如在 PostgreSQL 中:
ALTER SYSTEM SET statement_timeout = '30s';
然后在数据库重启后生效。
在 Celery 中,可以使用 heartbeat
参数来保持任务的心跳,防止连接被中断。
app.conf.update(
task_heartbeat=30,
task_time_limit=120
)
通过以上措施,可以有效解决 Flask + Celery + SQLAlchemy 组合中遇到的数据库连接超时问题。
领取专属 10元无门槛券
手把手带您无忧上云