报错信息
[2021-10-26 18:59:12,159: ERROR/ForkPoolWorker-30] roll back cause by '_AppCtxGlobals' object has no attribute 'session'
[2021-10-26 18:59:12,162: ERROR/ForkPoolWorker-30] Task views.online.get_deploy_status[2202c52e-e0e5-468b-bf75-19d13348317b] raised unexpected: AttributeError("'_AppCtxGlobals' object has no attribute 'session'")
Traceback (most recent call last):
File "/src/views/__init__.py", line 27, in __call__
return self.run(*args, **kwargs)
File "/src/views/online.py", line 34, in get_deploy_status
user_id=params['user_id'], skill_id=params['skill_id'], model_version=deploy_status['modelVersion'])
File "/src/views/common.py", line 94, in fetch_skill_online
skill_online = g.session.query(SkillOnline).filter_by(
AttributeError: '_AppCtxGlobals' object has no attribute 'session'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/venv/lib/python3.7/site-packages/celery/app/trace.py", line 409, in trace_task
R = retval = fun(*args, **kwargs)
File "/src/views/__init__.py", line 27, in __call__
return self.run(*args, **kwargs)
File "/venv/lib/python3.7/site-packages/flask/ctx.py", line 249, in __exit__
self.pop(exc_value)
File "/venv/lib/python3.7/site-packages/flask/ctx.py", line 238, in pop
self.app.do_teardown_appcontext(exc)
File "/venv/lib/python3.7/site-packages/flask/app.py", line 2321, in do_teardown_appcontext
func(exc)
File "/src/views/__init__.py", line 42, in shutdown_session
flask.g.session.rollback()
AttributeError: '_AppCtxGlobals' object has no attribute 'session'
原因
在celery的task任务中,使用了flask.g.session这个参数,它是连接sqlalchemey的对话参数。我理解flask.g是单次请求共用参数,但celery的task相当于新开一个进程进行处理,导致flask.g无法在task中共用。
解决办法
在celery的task任务中,再次对flask.g.session进行定义。
@celery.task
def get_deploy_status(params):
# celery无法和flask共用g
if 'session' not in flask.g:
flask.g.session = Session()