Coverage for fastapi/concurrency.py: 100%

18 statements  

« 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

3 

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) 

11 

12_T = TypeVar("_T") 1abcde

13 

14 

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 )