No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.
 
 
 
 

43 líneas
1.2 KiB

  1. from __future__ import annotations
  2. import sys
  3. from collections.abc import Sequence
  4. from typing import Any, Callable
  5. if sys.version_info >= (3, 10): # pragma: no cover
  6. from typing import ParamSpec
  7. else: # pragma: no cover
  8. from typing_extensions import ParamSpec
  9. from starlette._utils import is_async_callable
  10. from starlette.concurrency import run_in_threadpool
  11. P = ParamSpec("P")
  12. class BackgroundTask:
  13. def __init__(self, func: Callable[P, Any], *args: P.args, **kwargs: P.kwargs) -> None:
  14. self.func = func
  15. self.args = args
  16. self.kwargs = kwargs
  17. self.is_async = is_async_callable(func)
  18. async def __call__(self) -> None:
  19. if self.is_async:
  20. await self.func(*self.args, **self.kwargs)
  21. else:
  22. await run_in_threadpool(self.func, *self.args, **self.kwargs)
  23. class BackgroundTasks(BackgroundTask):
  24. def __init__(self, tasks: Sequence[BackgroundTask] | None = None):
  25. self.tasks = list(tasks) if tasks else []
  26. def add_task(self, func: Callable[P, Any], *args: P.args, **kwargs: P.kwargs) -> None:
  27. task = BackgroundTask(func, *args, **kwargs)
  28. self.tasks.append(task)
  29. async def __call__(self) -> None:
  30. for task in self.tasks:
  31. await task()