Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/starlette/background.py: 50%
24 statements
« prev ^ index » next coverage.py v7.2.2, created at 2023-03-26 06:12 +0000
« prev ^ index » next coverage.py v7.2.2, created at 2023-03-26 06:12 +0000
1import sys
2import typing
4if sys.version_info >= (3, 10): # pragma: no cover
5 from typing import ParamSpec
6else: # pragma: no cover
7 from typing_extensions import ParamSpec
9from starlette._utils import is_async_callable
10from starlette.concurrency import run_in_threadpool
12P = ParamSpec("P")
15class BackgroundTask:
16 def __init__(
17 self, func: typing.Callable[P, typing.Any], *args: P.args, **kwargs: P.kwargs
18 ) -> None:
19 self.func = func
20 self.args = args
21 self.kwargs = kwargs
22 self.is_async = is_async_callable(func)
24 async def __call__(self) -> None:
25 if self.is_async:
26 await self.func(*self.args, **self.kwargs)
27 else:
28 await run_in_threadpool(self.func, *self.args, **self.kwargs)
31class BackgroundTasks(BackgroundTask):
32 def __init__(self, tasks: typing.Optional[typing.Sequence[BackgroundTask]] = None):
33 self.tasks = list(tasks) if tasks else []
35 def add_task(
36 self, func: typing.Callable[P, typing.Any], *args: P.args, **kwargs: P.kwargs
37 ) -> None:
38 task = BackgroundTask(func, *args, **kwargs)
39 self.tasks.append(task)
41 async def __call__(self) -> None:
42 for task in self.tasks:
43 await task()