Coverage for fastapi/concurrency.py: 100%
18 statements
« prev ^ index » next coverage.py v7.6.1, created at 2024-11-18 22:23 +0000
« prev ^ index » next coverage.py v7.6.1, created at 2024-11-18 22:23 +0000
1from contextlib import asynccontextmanager as asynccontextmanager 1abcde
2from typing import AsyncGenerator, ContextManager, TypeVar 1abcde
4import anyio 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 +b,bv 5b-bw 6bAb.bx BbCb/by Db:bz A B ;bC D E f g =bF G H ?bI J K @b[bL Eb]bM Fb^bN GbHb_bO IbJb`bP KbLb{bQ Mb|bR S T }bU V W ~bX Y Z h i ac0 1 2 bc3 4 5 ccdc6 7bec7 8bfc8 9bNbgc9 ObPbhc! QbRbic# Sbjc$ % ' kc( ) * lc+ , - j k mc. / : nc; = ? ocpc@ !bqc[ #brc] $bTbsc^ UbVbtc_ WbXbuc` Ybvc{ | } wc~ abbbxccbdbebl m ycfbgbhbzcibjbkbAcBclb%bCcmb'bDcnb(bZbEcob0b1bFcpb2b3bGcqb4bHcrbsbtbIcubvbwbJcxbybzbn o
26 try: 2)bp q r *bs t u +b,bv 5b-bw 6bAb.bx BbCb/by Db:bz A B ;bC D E f g =bF G H ?bI J K @b[bL Eb]bM Fb^bN GbHb_bO IbJb`bP KbLb{bQ Mb|bR S T }bU V W ~bX Y Z h i ac0 1 2 bc3 4 5 ccdc6 7bec7 8bfc8 9bNbgc9 ObPbhc! QbRbic# Sbjc$ % ' kc( ) * lc+ , - j k mc. / : nc; = ? ocpc@ !bqc[ #brc] $bTbsc^ UbVbtc_ WbXbuc` Ybvc{ | } wc~ abbbxccbdbebl m ycfbgbhbzcibjbkbAcBclb%bCcmb'bDcnb(bZbEcob0b1bFcpb2b3bGcqb4bHcrbsbtbIcubvbwbJcxbybzbn o
27 yield await run_in_threadpool(cm.__enter__) 2)bp q r *bs t u +b,bv 5b-bw 6bAb.bx BbCb/by Db:bz A B ;bC D E f g =bF G H ?bI J K @b[bL Eb]bM Fb^bN GbHb_bO IbJb`bP KbLb{bQ Mb|bR S T }bU V W ~bX Y Z h i ac0 1 2 bc3 4 5 ccdc6 7bec7 8bfc8 9bNbgc9 ObPbhc! QbRbic# Sbjc$ % ' kc( ) * lc+ , - j k mc. / : nc; = ? ocpc@ !bqc[ #brc] $bTbsc^ UbVbtc_ WbXbuc` Ybvc{ | } wc~ abbbxccbdbebl m ycfbgbhbzcibjbkbAcBclb%bCcmb'bDcnb(bZbEcob0b1bFcpb2b3bGcqb4bHcrbsbtbIcubvbwbJcxbybzbn o
28 except Exception as e: 2p q r s t u v 5bw 6bAbx BbCby Dbz A B C D E f g F G H I J K L EbM FbN GbHbO IbJbP KbLbQ MbR S T U V W X Y Z h i 0 1 2 3 4 5 6 7b7 8b8 9bNb9 ObPb! QbRb# Sb$ % ' ( ) * + , - j k . / : ; = ? @ !b[ #b] $bTb^ UbVb_ WbXb` Yb{ | } ~ abbbcbdbebl m fbgbhbibjbkblb%bmb'bnb(bZbob0b1bpb2b3bqb4brbsbtbubvbwbxbybzbn o
29 ok = bool( 2p q r s t u v 5bw 6bAbx BbCby Dbz A B C D E f g F G H I J K L EbM FbN GbHbO IbJbP KbLbQ MbR S T U V W X Y Z h i 0 1 2 3 4 5 6 7b7 8b8 9bNb9 ObPb! QbRb# Sb$ % ' ( ) * + , - j k . / : ; = ? @ !b[ #b] $bTb^ UbVb_ WbXb` Yb{ | } ~ abbbcbdbebl m fbgbhbibjbkblb%bmb'bnb(bZbob0b1bpb2b3bqb4brbsbtbubvbwbxbybzbn o
30 await anyio.to_thread.run_sync(
31 cm.__exit__, type(e), e, None, limiter=exit_limiter
32 )
33 )
34 if not ok: 2p q r s t u v w Abx BbCby Dbz A B C D E f g F G H I J K L M N HbO IbJbP KbLbQ MbR S T U V W X Y Z h i 0 1 2 3 4 5 6 7 8 Nb9 ObPb! QbRb# Sb$ % ' ( ) * + , - j k . / : ; = ? @ [ ] Tb^ UbVb_ WbXb` Yb{ | } ~ abbbcbdbebl m fbgbhbibjbkblbmbnbZbob0b1bpb2b3bqb4brbsbtbubvbwbxbybzbn o
35 raise e 2p q r s t u v w x y z A B C D E f g F G H I J K L EbM FbN GbO P Q R S T U V W X Y Z h i 0 1 2 3 4 5 6 7 8 9 ! # $ % ' ( ) * + , - j k . / : ; = ? @ [ ] ^ _ ` { | } ~ abbbcbdbebl m fbgbhbibjbkblbmbnbobpbqbrbsbtbubvbwbxbybzbn 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_b`b{b|b}b~bh i acbcccdcecfcgchcicjckclcj k mcncocpcqcrcsctcucvcwcxcl m yczcAcBcCcDcEcFcGcHcIcJcn o
38 cm.__exit__, None, None, None, limiter=exit_limiter
39 )