aboutsummaryrefslogtreecommitdiff
path: root/.venv/lib/python3.12/site-packages/starlette/concurrency.py
diff options
context:
space:
mode:
Diffstat (limited to '.venv/lib/python3.12/site-packages/starlette/concurrency.py')
-rw-r--r--.venv/lib/python3.12/site-packages/starlette/concurrency.py62
1 files changed, 62 insertions, 0 deletions
diff --git a/.venv/lib/python3.12/site-packages/starlette/concurrency.py b/.venv/lib/python3.12/site-packages/starlette/concurrency.py
new file mode 100644
index 00000000..494f3420
--- /dev/null
+++ b/.venv/lib/python3.12/site-packages/starlette/concurrency.py
@@ -0,0 +1,62 @@
+from __future__ import annotations
+
+import functools
+import sys
+import typing
+import warnings
+
+import anyio.to_thread
+
+if sys.version_info >= (3, 10): # pragma: no cover
+ from typing import ParamSpec
+else: # pragma: no cover
+ from typing_extensions import ParamSpec
+
+P = ParamSpec("P")
+T = typing.TypeVar("T")
+
+
+async def run_until_first_complete(*args: tuple[typing.Callable, dict]) -> None: # type: ignore[type-arg]
+ warnings.warn(
+ "run_until_first_complete is deprecated and will be removed in a future version.",
+ DeprecationWarning,
+ )
+
+ async with anyio.create_task_group() as task_group:
+
+ async def run(func: typing.Callable[[], typing.Coroutine]) -> None: # type: ignore[type-arg]
+ await func()
+ task_group.cancel_scope.cancel()
+
+ for func, kwargs in args:
+ task_group.start_soon(run, functools.partial(func, **kwargs))
+
+
+async def run_in_threadpool(func: typing.Callable[P, T], *args: P.args, **kwargs: P.kwargs) -> T:
+ func = functools.partial(func, *args, **kwargs)
+ return await anyio.to_thread.run_sync(func)
+
+
+class _StopIteration(Exception):
+ pass
+
+
+def _next(iterator: typing.Iterator[T]) -> T:
+ # We can't raise `StopIteration` from within the threadpool iterator
+ # and catch it outside that context, so we coerce them into a different
+ # exception type.
+ try:
+ return next(iterator)
+ except StopIteration:
+ raise _StopIteration
+
+
+async def iterate_in_threadpool(
+ iterator: typing.Iterable[T],
+) -> typing.AsyncIterator[T]:
+ as_iterator = iter(iterator)
+ while True:
+ try:
+ yield await anyio.to_thread.run_sync(_next, as_iterator)
+ except _StopIteration:
+ break