mirror of
https://github.com/GSA/notifications-api.git
synced 2025-12-12 16:22:17 -05:00
Celery tasks require an active app context in order to use app logger, database or app configuration values. Since there's no builtin support we create this context by using a custom celery task class NotifyTask. However, NotifyTask was using `current_app`, which itself is only available within an app context so the code was pushing an initial context in run_celery.py. This works with the default prefork pool implementation, but raises a "working outside of application context" error with an eventlet pool since that initial application context is local to a thread and eventlet celery worker pool will create multiple green threads. To avoid this, we bind NotifyTask to the app variable with a closure and use that variable instead of `current_app` to create the context for executing the task. This avoids any issues caused by shared initial app context being lost when spawning additional worker threads. We still need to keep the context push in run_celery.py for prefork workers since it's required for logging events outside of tasks (eg logging during `worker_process_shutdown` signal processing).
12 lines
274 B
Python
12 lines
274 B
Python
#!/usr/bin/env python
|
|
|
|
from flask import Flask
|
|
|
|
# notify_celery is referenced from manifest_delivery_base.yml, and cannot be removed
|
|
from app import notify_celery, create_app # noqa
|
|
|
|
|
|
application = Flask('delivery')
|
|
create_app(application)
|
|
application.app_context().push()
|