
Prod mode uses separate worker processes that fork from the main process. If the app is not fully compiled when the fork occurs, any further changes to the app (like mounting the _upload endpoint) will not be reflected in the workers. This is not a performance hit because compile is skipped anyway for backend processes and hot reload is not in the picture for prod mode.
32 lines
997 B
Python
32 lines
997 B
Python
"""Shims the real reflex app module for running backend server (uvicorn or gunicorn).
|
|
Only the app attribute is explicitly exposed.
|
|
"""
|
|
from concurrent.futures import ThreadPoolExecutor
|
|
|
|
from reflex import constants
|
|
from reflex.utils.exec import is_prod_mode
|
|
from reflex.utils.prerequisites import get_app, get_compiled_app
|
|
|
|
if "app" != constants.CompileVars.APP:
|
|
raise AssertionError("unexpected variable name for 'app'")
|
|
|
|
app_module = get_app(reload=False)
|
|
app = getattr(app_module, constants.CompileVars.APP)
|
|
compile_future = ThreadPoolExecutor(max_workers=1).submit(app.compile_)
|
|
compile_future.add_done_callback(
|
|
# Force background compile errors to print eagerly
|
|
lambda f: f.result()
|
|
)
|
|
# Wait for the compile to finish in prod mode to ensure all optional endpoints are mounted.
|
|
if is_prod_mode():
|
|
compile_future.result()
|
|
|
|
# ensure only "app" is exposed.
|
|
del app_module
|
|
del compile_future
|
|
del get_app
|
|
del get_compiled_app
|
|
del is_prod_mode
|
|
del constants
|
|
del ThreadPoolExecutor
|