|
1 | 1 | """Main application to be deployed in for example uvicorn.""" |
2 | 2 |
|
3 | | -import asyncio |
4 | 3 | import logging |
5 | | -import threading |
6 | | -from typing import Final |
7 | 4 |
|
8 | | -from asgi_lifespan import LifespanManager |
9 | | -from celery import Celery |
| 5 | +from celery.contrib.abortable import AbortableTask |
10 | 6 | from celery.signals import worker_init, worker_shutdown |
11 | | -from fastapi import FastAPI |
12 | | -from servicelib.background_task import cancel_wait_task |
13 | 7 | from servicelib.logging_utils import config_all_loggers |
14 | | -from simcore_service_storage.modules.celery import get_event_loop, set_event_loop |
15 | | -from simcore_service_storage.modules.celery.utils import ( |
16 | | - CeleryTaskQueueWorker, |
17 | | - get_fastapi_app, |
18 | | - set_celery_worker, |
19 | | - set_fastapi_app, |
| 8 | +from simcore_service_storage.modules.celery.signals import ( |
| 9 | + on_worker_init, |
| 10 | + on_worker_shutdown, |
20 | 11 | ) |
21 | 12 |
|
22 | | -from ...core.application import create_app |
23 | 13 | from ...core.settings import ApplicationSettings |
24 | 14 | from ._common import create_app as create_celery_app |
| 15 | +from .tasks import export_data |
25 | 16 |
|
26 | 17 | _settings = ApplicationSettings.create_from_envs() |
27 | 18 |
|
|
35 | 26 |
|
36 | 27 | _logger = logging.getLogger(__name__) |
37 | 28 |
|
38 | | -_LIFESPAN_TIMEOUT: Final[int] = 10 |
39 | | - |
40 | | - |
41 | | -@worker_init.connect |
42 | | -def on_worker_init(sender, **_kwargs): |
43 | | - def _init_fastapi(): |
44 | | - loop = asyncio.new_event_loop() |
45 | | - asyncio.set_event_loop(loop) |
46 | | - shutdown_event = asyncio.Event() |
47 | | - |
48 | | - fastapi_app = create_app(_settings) |
49 | | - |
50 | | - async def lifespan(): |
51 | | - async with LifespanManager( |
52 | | - fastapi_app, |
53 | | - startup_timeout=_LIFESPAN_TIMEOUT, |
54 | | - shutdown_timeout=_LIFESPAN_TIMEOUT, |
55 | | - ): |
56 | | - try: |
57 | | - await shutdown_event.wait() |
58 | | - except asyncio.CancelledError: |
59 | | - _logger.warning("Lifespan task cancelled") |
60 | | - |
61 | | - lifespan_task = loop.create_task(lifespan()) |
62 | | - fastapi_app.state.lifespan_task = lifespan_task |
63 | | - fastapi_app.state.shutdown_event = shutdown_event |
64 | | - set_event_loop(fastapi_app, loop) |
65 | | - |
66 | | - set_fastapi_app(sender.app, fastapi_app) |
67 | | - set_celery_worker(sender.app, CeleryTaskQueueWorker(sender.app)) |
68 | | - |
69 | | - loop.run_forever() |
70 | | - |
71 | | - thread = threading.Thread(target=_init_fastapi, daemon=True) |
72 | | - thread.start() |
73 | | - |
74 | | - |
75 | | -@worker_shutdown.connect |
76 | | -def on_worker_shutdown(sender, **_kwargs): |
77 | | - assert isinstance(sender.app, Celery) |
78 | | - |
79 | | - fastapi_app = get_fastapi_app(sender.app) |
80 | | - assert isinstance(fastapi_app, FastAPI) |
81 | | - event_loop = get_event_loop(fastapi_app) |
82 | | - |
83 | | - async def shutdown(): |
84 | | - fastapi_app.state.shutdown_event.set() |
85 | | - |
86 | | - await cancel_wait_task(fastapi_app.state.lifespan_task, max_delay=5) |
87 | | - |
88 | | - asyncio.run_coroutine_threadsafe(shutdown(), event_loop) |
89 | | - |
90 | | - |
91 | 29 | assert _settings.STORAGE_CELERY |
92 | 30 | app = create_celery_app(_settings.STORAGE_CELERY) |
| 31 | +worker_init.connect(on_worker_init) |
| 32 | +worker_shutdown.connect(on_worker_shutdown) |
| 33 | +app.task(name="export_data", bind=True, base=AbortableTask)(export_data) |
0 commit comments