import asyncio import time from concurrent.futures import ThreadPoolExecutor executor = ThreadPoolExecutor(max_workers=5) loop = asyncio.get_event_loop() loop.set_default_executor(executor) def block(): time.sleep(0.1) async def main(): for i in range(3): loop.run_in_executor(None, block) await asyncio.sleep(0.2) print("idle threads", executor._idle_semaphore._value) # 3 - correct for i in range(5): loop.run_in_executor(None, block) await asyncio.sleep(0.2) print("idle threads", executor._idle_semaphore._value) # 5 - correct for i in range(20): loop.run_in_executor(None, block) await asyncio.sleep(0.5) print("idle threads", executor._idle_semaphore._value) # 20 - wrong for i in range(2): loop.run_in_executor(None, block) await asyncio.sleep(0.2) print("idle threads", executor._idle_semaphore._value) # 20 - still wrong loop.run_until_complete(main())