6
6
from taskiq .cli .utils import import_object
7
7
8
8
9
- def startup_event_generator (app : FastAPI ) -> Callable [[TaskiqState ], Awaitable [None ]]:
9
+ def startup_event_generator (
10
+ broker : AsyncBroker ,
11
+ app_path : str ,
12
+ ) -> Callable [[TaskiqState ], Awaitable [None ]]:
10
13
"""
11
14
Generate shutdown event.
12
15
13
- This function takes FastAPI application
16
+ This function takes FastAPI application path
14
17
and runs startup event on broker's startup.
15
18
16
- :param app: fastapi application.
19
+ :param broker: current broker.
20
+ :param app_path: fastapi application path.
17
21
:returns: startup handler.
18
22
"""
19
23
20
24
async def startup (state : TaskiqState ) -> None :
25
+ if not broker .is_worker_process :
26
+ return
27
+ app = import_object (app_path )
28
+ if not isinstance (app , FastAPI ):
29
+ app = app ()
30
+
31
+ if not isinstance (app , FastAPI ):
32
+ raise ValueError (f"'{ app_path } ' is not a FastAPI application." )
33
+
21
34
state .fastapi_app = app
22
35
app .router .routes = []
23
36
await app .router .startup ()
37
+ populate_dependency_context (broker , app )
24
38
25
39
return startup
26
40
27
41
28
- def shutdown_event_generator (app : FastAPI ) -> Callable [[TaskiqState ], Awaitable [None ]]:
42
+ def shutdown_event_generator (
43
+ broker : AsyncBroker ,
44
+ ) -> Callable [[TaskiqState ], Awaitable [None ]]:
29
45
"""
30
46
Generate shutdown event.
31
47
32
48
This function takes FastAPI application
33
49
and runs shutdown event on broker's shutdown.
34
50
35
- :param app : current application .
36
- :return: startup event handler.
51
+ :param broker : current broker .
52
+ :return: shutdown event handler.
37
53
"""
38
54
39
- async def startup (_ : TaskiqState ) -> None :
40
- await app .router .shutdown ()
55
+ async def shutdown (state : TaskiqState ) -> None :
56
+ if not broker .is_worker_process :
57
+ return
58
+ await state .fastapi_app .router .shutdown ()
41
59
42
- return startup
60
+ return shutdown
43
61
44
62
45
63
def init (broker : AsyncBroker , app_path : str ) -> None :
@@ -49,35 +67,21 @@ def init(broker: AsyncBroker, app_path: str) -> None:
49
67
This is the main function to integrate FastAPI
50
68
with taskiq.
51
69
52
- This function imports fastapi application by
53
- python's path string and adds startup events
54
- for broker .
70
+ It creates startup events for broker. So
71
+ in worker processes all fastapi
72
+ startup events will run .
55
73
56
74
:param broker: current broker to use.
57
75
:param app_path: path to fastapi application.
58
- :raises ValueError: if fastapi cannot be resolved.
59
76
"""
60
- if not broker .is_worker_process :
61
- return
62
-
63
- app = import_object (app_path )
64
-
65
- if not isinstance (app , FastAPI ):
66
- app = app ()
67
-
68
- if not isinstance (app , FastAPI ):
69
- raise ValueError (f"'{ app_path } ' is not a FastAPI application." )
70
-
71
- populate_dependency_context (broker , app )
72
-
73
77
broker .add_event_handler (
74
78
TaskiqEvents .WORKER_STARTUP ,
75
- startup_event_generator (app ),
79
+ startup_event_generator (broker , app_path ),
76
80
)
77
81
78
82
broker .add_event_handler (
79
83
TaskiqEvents .WORKER_SHUTDOWN ,
80
- shutdown_event_generator (app ),
84
+ shutdown_event_generator (broker ),
81
85
)
82
86
83
87
0 commit comments