Вы увеличиваете число рабочих потоков
ThreadPoolExecutor, настраиваете пул соединений, а пропускная способность перестаёт расти. Даже короткий вычислительный участок повторяется в каждом задании и постепенно отбирает выигрыш от новых потоков.Перейти на
ProcessPoolExecutor можно, но тогда вход приходится разбивать на пачки, менять код и платить памятью за процессы. Автор собирает гибрид: несколько процессов, внутри каждого пул потоков, с привычным интерфейсом исполнителя задач.В разборе ProcessThreadPoolExecutor остались возврат результатов через собственные объекты
Future, гибель рабочего процесса и влияние свободнопоточного Python на всю конструкцию.