我正在尝试在Heroku上部署一个使用Celery后台任务的Flask应用程序。我已经实现了应用工厂模式,以便Celery进程不绑定到任何一个Flask应用程序实例。
这在本地运行良好,但是当部署到Heroku时,总是出现相同的结果:celery任务(我只使用一个)第一次成功运行,但是对该任务的任何后续celery调用都会失败,并显示
有多个 问题显示了相同的错误,但没有明确的解决方法。我最初认为实现应用工厂模式将防止此错误发生,但它还没有完全实现。
在
这在本地运行良好,但是当部署到Heroku时,总是出现相同的结果:celery任务(我只使用一个)第一次成功运行,但是对该任务的任何后续celery调用都会失败,并显示
sqlalchemy.exc.DatabaseError: (psycopg2.DatabaseError) SSL error: decryption failed or bad record mac
。如果我重新启动celery worker,则循环继续。有多个 问题显示了相同的错误,但没有明确的解决方法。我最初认为实现应用工厂模式将防止此错误发生,但它还没有完全实现。
在
app/__init__.py
文件中,我创建了celery和db对象:celery = Celery(__name__, broker=Config.CELERY_BROKER_URL)
db = SQLAlchemy()
def create_app(config_name):
app = Flask(__name__)
app.config.from_object(config[config_name])
db.init_app(app)
return app
我的flask_celery.py
文件创建了实际的Flask应用程序对象:
import os
from app import celery, create_app
app = create_app(os.getenv('FLASK_CONFIG', 'default'))
app.app_context().push()
我使用以下命令启动celery:
celery worker -A app.flask_celery.celery --loglevel=info
这是实际的celery任务代码:
@celery.task()
def task_process_stuff(stuff_id):
stuff = Stuff.query.get(stuff_id)
stuff.processed = True
db.session.add(stuff)
db.session.commit()
return stuff
被以下调用:
task_process_stuff.apply_async(args=[stuff.id], countdown=10)
库版本
- Flask 0.12.2
- SQLAlchemy 1.1.11
- Flask-SQLAlchemy 2.2
- Celery 4.0.2
db.session.remove()
怎么样?这应该会强制重新建立连接。 - Oluwafemi Suledb.session.remove()
,但错误仍然存在。 - Anconia