Coverage for faststream / _internal / cli / supervisors / asgi_multiprocess.py: 0%
30 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-05-08 01:48 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-05-08 01:48 +0000
1import inspect
2from typing import TYPE_CHECKING, Any
4from faststream._internal._compat import HAS_UVICORN, uvicorn
5from faststream.asgi.app import cast_uvicorn_params
6from faststream.exceptions import INSTALL_UVICORN
8if TYPE_CHECKING:
9 from faststream._internal.basic_types import SettingField
10 from faststream._internal.cli.dto import RunArgs
12if HAS_UVICORN:
13 from uvicorn.supervisors.multiprocess import Multiprocess, Process
15 class UvicornExtraConfig(uvicorn.Config): # type: ignore[misc]
16 def __init__(
17 self,
18 run_extra_options: dict[str, "SettingField"],
19 *args: Any,
20 **kwargs: Any,
21 ) -> None:
22 super().__init__(*args, **kwargs)
23 self._run_extra_options = run_extra_options
25 def load(self) -> None:
26 super().load()
27 self.loaded_app.app._run_extra_options = self._run_extra_options
29 class UvicornMultiprocess(Multiprocess):
30 config: UvicornExtraConfig
32 def init_processes(self) -> None:
33 for i in range(self.processes_num):
34 self.config._run_extra_options["worker_id"] = i
35 process = Process(self.config, self.target, self.sockets)
36 process.start()
37 self.processes.append(process)
40class ASGIMultiprocess:
41 def __init__(
42 self,
43 target: str,
44 args: "RunArgs",
45 workers: int,
46 ) -> None:
47 self._target = target
48 self._run_extra_options = cast_uvicorn_params(args.extra_options)
49 self._workers = workers
50 self._is_factory = args.is_factory
51 self._log_level = args.log_level
53 def run(self) -> None:
54 if not HAS_UVICORN:
55 raise ImportError(INSTALL_UVICORN)
57 config = UvicornExtraConfig(
58 app=self._target,
59 factory=self._is_factory,
60 log_level=self._log_level,
61 workers=self._workers,
62 **{
63 key: v
64 for key, v in self._run_extra_options.items()
65 if key in set(inspect.signature(uvicorn.Config).parameters.keys())
66 },
67 run_extra_options=self._run_extra_options,
68 )
69 server = uvicorn.Server(config)
70 sock = config.bind_socket()
71 UvicornMultiprocess(config, target=server.run, sockets=[sock]).run()