loop.run_in_executor ограничен количеством ядер?
это смотря какой executor
ThreadPoolExecutor
ну тогда не ограничен
у меня 4 ядра с гипертредингом. Для теста запустил 20 функций, которые блокируют выполнение def blocking_code(n: int, seconds: int): import time import logging logging.warning(f"starting blocking {n}") time.sleep(seconds) logging.warning(f"stop blocking {n}") return async def start_thread_blocking_operations(): coros = [run_in_threadpool(partial(blocking_code, n, 5)) for n in range(1, 20)] await asyncio.gather(*tasks) и по логам было чётко видно, что 8 раз пишется f"starting blocking {n}", затем ожидание в 5 секунд, 8 раз это f"stop blocking {n}" и дальше снова всё по кругу, пока все 20 не пройдёт группами по 8
понял проблему. По умолчанию в ThreadPoolExecutor ставится max_workers=os.cpu_cunt()+4, что для меня 8+4=12. Увеличил max_workers и всё ок
Обсуждают сегодня