Coverage for fastapi/concurrency.py: 100%
18 statements
« prev ^ index » next coverage.py v7.6.1, created at 2025-01-13 13:38 +0000
« prev ^ index » next coverage.py v7.6.1, created at 2025-01-13 13:38 +0000
1from contextlib import asynccontextmanager as asynccontextmanager 1abcde
2from typing import AsyncGenerator, ContextManager, TypeVar 1abcde
4import anyio.to_thread 1abcde
5from anyio import CapacityLimiter 1abcde
6from starlette.concurrency import iterate_in_threadpool as iterate_in_threadpool # noqa 1abcde
7from starlette.concurrency import run_in_threadpool as run_in_threadpool # noqa 1abcde
8from starlette.concurrency import ( # noqa 1abcde
9 run_until_first_complete as run_until_first_complete,
10)
12_T = TypeVar("_T") 1abcde
15@asynccontextmanager 1abcde
16async def contextmanager_in_threadpool( 1abcde
17 cm: ContextManager[_T],
18) -> AsyncGenerator[_T, None]:
19 # blocking __exit__ from running waiting on a free thread
20 # can create race conditions/deadlocks if the context manager itself
21 # has its own internal pool (e.g. a database connection pool)
22 # to avoid this we let __exit__ run without a capacity limit
23 # since we're creating a new limiter for each call, any non-zero limit
24 # works (1 is arbitrary)
25 exit_limiter = CapacityLimiter(1) 2.bp q r /bs t u :bv ;bw !b=bx #bFb?by GbHb@bz Ib[bA B C ]bD E F f g ^bG H I _bJ K L `bM {bN Jb|bO Kb}bP LbMb~bQ NbObacR PbQbbcS RbccT U V dcW X Y ecZ 0 1 h i fc2 3 4 gc5 6 7 hc8 ic9 $bjc! %bkc# 'bSblc$ TbUbmc% VbWbnc' Xboc( ) * pc+ , - qc. / : j k rc; = ? sc@ [ ] tc^ uc_ (bvc` )bwc{ *bYbxc| Zb0byc} 1b2bzc~ 3bAcabbbcbBcdbebfbCcgbhbibl m DcjbkblbEcmbnbobFcpbGcqb+bHcrb,bIcsb-b4bJctb5b6bKcub7b8bLcvb9bMcwbxbybNczbAbBbOcCbDbEbn o
26 try: 2.bp q r /bs t u :bv ;bw !b=bx #bFb?by GbHb@bz Ib[bA B C ]bD E F f g ^bG H I _bJ K L `bM {bN Jb|bO Kb}bP LbMb~bQ NbObacR PbQbbcS RbccT U V dcW X Y ecZ 0 1 h i fc2 3 4 gc5 6 7 hc8 ic9 $bjc! %bkc# 'bSblc$ TbUbmc% VbWbnc' Xboc( ) * pc+ , - qc. / : j k rc; = ? sc@ [ ] tc^ uc_ (bvc` )bwc{ *bYbxc| Zb0byc} 1b2bzc~ 3bAcabbbcbBcdbebfbCcgbhbibl m DcjbkblbEcmbnbobFcpbGcqb+bHcrb,bIcsb-b4bJctb5b6bKcub7b8bLcvb9bMcwbxbybNczbAbBbOcCbDbEbn o
27 yield await run_in_threadpool(cm.__enter__) 2.bp q r /bs t u :bv ;bw !b=bx #bFb?by GbHb@bz Ib[bA B C ]bD E F f g ^bG H I _bJ K L `bM {bN Jb|bO Kb}bP LbMb~bQ NbObacR PbQbbcS RbccT U V dcW X Y ecZ 0 1 h i fc2 3 4 gc5 6 7 hc8 ic9 $bjc! %bkc# 'bSblc$ TbUbmc% VbWbnc' Xboc( ) * pc+ , - qc. / : j k rc; = ? sc@ [ ] tc^ uc_ (bvc` )bwc{ *bYbxc| Zb0byc} 1b2bzc~ 3bAcabbbcbBcdbebfbCcgbhbibl m DcjbkblbEcmbnbobFcpbGcqb+bHcrb,bIcsb-b4bJctb5b6bKcub7b8bLcvb9bMcwbxbybNczbAbBbOcCbDbEbn o
28 except Exception as e: 2p q r s t u v w !bx #bFby GbHbz IbA B C D E F f g G H I J K L M N JbO KbP LbMbQ NbObR PbQbS RbT U V W X Y Z 0 1 h i 2 3 4 5 6 7 8 9 $b! %b# 'bSb$ TbUb% VbWb' Xb( ) * + , - . / : j k ; = ? @ [ ] ^ _ (b` )b{ *bYb| Zb0b} 1b2b~ 3babbbcbdbebfbgbhbibl m jbkblbmbnbobpbqb+brb,bsb-b4btb5b6bub7b8bvb9bwbxbybzbAbBbCbDbEbn o
29 ok = bool( 2p q r s t u v w !bx #bFby GbHbz IbA B C D E F f g G H I J K L M N JbO KbP LbMbQ NbObR PbQbS RbT U V W X Y Z 0 1 h i 2 3 4 5 6 7 8 9 $b! %b# 'bSb$ TbUb% VbWb' Xb( ) * + , - . / : j k ; = ? @ [ ] ^ _ (b` )b{ *bYb| Zb0b} 1b2b~ 3babbbcbdbebfbgbhbibl m jbkblbmbnbobpbqb+brb,bsb-b4btb5b6bub7b8bvb9bwbxbybzbAbBbCbDbEbn o
30 await anyio.to_thread.run_sync(
31 cm.__exit__, type(e), e, e.__traceback__, limiter=exit_limiter
32 )
33 )
34 if not ok: 2p q r s t u v w x Fby GbHbz IbA B C D E F f g G H I J K L M N O P MbQ NbObR PbQbS RbT U V W X Y Z 0 1 h i 2 3 4 5 6 7 8 9 ! # Sb$ TbUb% VbWb' Xb( ) * + , - . / : j k ; = ? @ [ ] ^ _ ` { Yb| Zb0b} 1b2b~ 3babbbcbdbebfbgbhbibl m jbkblbmbnbobpbqbrbsb4btb5b6bub7b8bvb9bwbxbybzbAbBbCbDbEbn o
35 raise e 2p q r s t u v w x y z A B C D E F f g G H I J K L M N JbO KbP LbQ R S T U V W X Y Z 0 1 h i 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : j k ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibl m jbkblbmbnbobpbqbrbsbtbubvbwbxbybzbAbBbCbDbEbn o
36 else:
37 await anyio.to_thread.run_sync( 2.b/b:b;b=b?b@b[b]bf g ^b_b`b{b|b}b~bacbcccdcech i fcgchcicjckclcmcncocpcqcj k rcsctcucvcwcxcyczcAcBcCcl m DcEcFcGcHcIcJcKcLcMcNcOcn o
38 cm.__exit__, None, None, None, limiter=exit_limiter
39 )