Coverage for fastapi/concurrency.py: 100%
18 statements
« prev ^ index » next coverage.py v7.6.1, created at 2024-09-06 16:22 +0000
« prev ^ index » next coverage.py v7.6.1, created at 2024-09-06 16:22 +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^br s t _bu v w `b{bx ,b|by -bOb}bz PbQb~bA RbacB C D bcE F G ccf dcecH fcgchcI J K icL M N jckcO SblcP TbmcQ UbVbncR WbXbocS YbZbpcT 0bqcU V W rcX Y Z sc0 1 2 tcg ucvc3 wcxch yczc4 AcBcCcDc5 6 7 Ec8 9 ! FcGc# .bHc$ /bIc% :b1bJc' 2b3bKc( 4b5bLc) 6bMc* + , Nc- . / Oc: ; = Pci QcRc? ScTcj UcVc@ WcXck YcZc[ 0c1c2c3c4c] ^ _ 5c` { | 6c7c} ;b8c~ =b9cab?b7b!cbb8b9b#ccb!b#b$cdb$b%cebfbgb'chbibjb(ckblbmb)cl *c+cnb,c-cm .c/cob:c;cn =c?cpb@c[c]c^c_cqbrbsb`ctbubvb{c|cwb@b}cxb[b~cyb]b%badzb'b(bbdAb)b*bcdBb+bddCbDbEbedFbGbHbfdIbJbKbgdo hdidLbjdkdp ldmdMbndodq pdqdNbrdsdtdud
26 try: 2^br s t _bu v w `b{bx ,b|by -bOb}bz PbQb~bA RbacB C D bcE F G ccf dcecH fcgchcI J K icL M N jckcO SblcP TbmcQ UbVbncR WbXbocS YbZbpcT 0bqcU V W rcX Y Z sc0 1 2 tcg ucvc3 wcxch yczc4 AcBcCcDc5 6 7 Ec8 9 ! FcGc# .bHc$ /bIc% :b1bJc' 2b3bKc( 4b5bLc) 6bMc* + , Nc- . / Oc: ; = Pci QcRc? ScTcj UcVc@ WcXck YcZc[ 0c1c2c3c4c] ^ _ 5c` { | 6c7c} ;b8c~ =b9cab?b7b!cbb8b9b#ccb!b#b$cdb$b%cebfbgb'chbibjb(ckblbmb)cl *c+cnb,c-cm .c/cob:c;cn =c?cpb@c[c]c^c_cqbrbsb`ctbubvb{c|cwb@b}cxb[b~cyb]b%badzb'b(bbdAb)b*bcdBb+bddCbDbEbedFbGbHbfdIbJbKbgdo hdidLbjdkdp ldmdMbndodq pdqdNbrdsdtdud
27 yield await run_in_threadpool(cm.__enter__) 2^br s t _bu v w `b{bx ,b|by -bOb}bz PbQb~bA RbacB C D bcE F G ccf dcecH fcgchcI J K icL M N jckcO SblcP TbmcQ UbVbncR WbXbocS YbZbpcT 0bqcU V W rcX Y Z sc0 1 2 tcg ucvc3 wcxch yczc4 AcBcCcDc5 6 7 Ec8 9 ! FcGc# .bHc$ /bIc% :b1bJc' 2b3bKc( 4b5bLc) 6bMc* + , Nc- . / Oc: ; = Pci QcRc? ScTcj UcVc@ WcXck YcZc[ 0c1c2c3c4c] ^ _ 5c` { | 6c7c} ;b8c~ =b9cab?b7b!cbb8b9b#ccb!b#b$cdb$b%cebfbgb'chbibjb(ckblbmb)cl *c+cnb,c-cm .c/cob:c;cn =c?cpb@c[c]c^c_cqbrbsb`ctbubvb{c|cwb@b}cxb[b~cyb]b%badzb'b(bbdAb)b*bcdBb+bddCbDbEbedFbGbHbfdIbJbKbgdo hdidLbjdkdp ldmdMbndodq pdqdNbrdsdtdud
28 except Exception as e: 2r s t u v w x ,by -bObz PbQbA RbB C D E F G f H I J K L M N O SbP TbQ UbVbR WbXbS YbZbT 0bU V W X Y Z 0 1 2 g 3 h 4 5 6 7 8 9 ! # .b$ /b% :b1b' 2b3b( 4b5b) 6b* + , - . / : ; = i ? j @ k [ ] ^ _ ` { | } ;b~ =bab?b7bbb8b9bcb!b#bdb$bebfbgbhbibjbkblbmbl nbm obn pbqbrbsbtbubvbwb@bxb[byb]b%bzb'b(bAb)b*bBb+bCbDbEbFbGbHbIbJbKbo Lbp Mbq Nb
29 ok = bool( 2r s t u v w x ,by -bObz PbQbA RbB C D E F G f H I J K L M N O SbP TbQ UbVbR WbXbS YbZbT 0bU V W X Y Z 0 1 2 g 3 h 4 5 6 7 8 9 ! # .b$ /b% :b1b' 2b3b( 4b5b) 6b* + , - . / : ; = i ? j @ k [ ] ^ _ ` { | } ;b~ =bab?b7bbb8b9bcb!b#bdb$bebfbgbhbibjbkblbmbl nbm obn pbqbrbsbtbubvbwb@bxb[byb]b%bzb'b(bAb)b*bBb+bCbDbEbFbGbHbIbJbKbo Lbp Mbq Nb
30 await anyio.to_thread.run_sync(
31 cm.__exit__, type(e), e, None, limiter=exit_limiter
32 )
33 )
34 if not ok: 2r s t u v w x y Obz PbQbA RbB C D E F G f H I J K L M N O P Q VbR WbXbS YbZbT 0bU V W X Y Z 0 1 2 g 3 h 4 5 6 7 8 9 ! # $ % 1b' 2b3b( 4b5b) 6b* + , - . / : ; = i ? j @ k [ ] ^ _ ` { | } ~ ab7bbb8b9bcb!b#bdb$bebfbgbhbibjbkblbmbl nbm obn pbqbrbsbtbubvbwbxbyb%bzb'b(bAb)b*bBb+bCbDbEbFbGbHbIbJbKbo Lbp Mbq Nb
35 raise e 2r s t u v w x y z A B C D E F G f H I J K L M N O SbP TbQ UbR S T U V W X Y Z 0 1 2 g 3 h 4 5 6 7 8 9 ! # $ % ' ( ) * + , - . / : ; = i ? j @ k [ ] ^ _ ` { | } ~ abbbcbdbebfbgbhbibjbkblbmbl nbm obn pbqbrbsbtbubvbwbxbybzbAbBbCbDbEbFbGbHbIbJbKbo Lbp Mbq Nb
36 else:
37 await anyio.to_thread.run_sync( 2^b_b`b{b|b}b~bacbcccf dcecfcgchcicjckclcmcncocpcqcrcsctcg ucvcwcxch yczcAcBcCcDcEcFcGcHcIcJcKcLcMcNcOcPci QcRcScTcj UcVcWcXck YcZc0c1c2c3c4c5c6c7c8c9c!c#c$c%c'c(c)cl *c+c,c-cm .c/c:c;cn =c?c@c[c]c^c_c`c{c|c}c~cadbdcdddedfdgdo hdidjdkdp ldmdndodq pdqdrdsdtdud
38 cm.__exit__, None, None, None, limiter=exit_limiter
39 )