Du kannst nicht mehr als 25 Themen auswählen Themen müssen entweder mit einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.
 
 
 
 

33 Zeilen
1.0 KiB

  1. import sys
  2. from typing import AsyncGenerator, ContextManager, TypeVar
  3. from starlette.concurrency import iterate_in_threadpool as iterate_in_threadpool # noqa
  4. from starlette.concurrency import run_in_threadpool as run_in_threadpool # noqa
  5. from starlette.concurrency import ( # noqa
  6. run_until_first_complete as run_until_first_complete,
  7. )
  8. if sys.version_info >= (3, 7):
  9. from contextlib import AsyncExitStack as AsyncExitStack
  10. from contextlib import asynccontextmanager as asynccontextmanager
  11. else:
  12. from contextlib2 import AsyncExitStack as AsyncExitStack # noqa
  13. from contextlib2 import asynccontextmanager as asynccontextmanager # noqa
  14. _T = TypeVar("_T")
  15. @asynccontextmanager
  16. async def contextmanager_in_threadpool(
  17. cm: ContextManager[_T],
  18. ) -> AsyncGenerator[_T, None]:
  19. try:
  20. yield await run_in_threadpool(cm.__enter__)
  21. except Exception as e:
  22. ok = await run_in_threadpool(cm.__exit__, type(e), e, None)
  23. if not ok:
  24. raise e
  25. else:
  26. await run_in_threadpool(cm.__exit__, None, None, None)