#ликбез Необходимость воркеров в том, чтобы использовать все доступные ядра. Один интерпретатор ограничен GIL и утилизирует либо ноль ядер (если все треды встали на блокирующих операциях), либо одно, потому что треды хоть и существуют, GIL не дает им работать параллельно, потому что иначе в язык пришлось бы завозить сложную memory model, а он в целом и не предназначен для таких штук. Блокирующая операция - это, например, чтение файла или синхронный запрос к БД / иному сетевому сервису - в этом случае ОС перемещает его в спящий режим, и он освобождает ЦПУ. В случае наличия N тредов как только один тред уходит в блокирующую операцию, он больше не удерживает GIL и позволяет работать другому, занимая ядро цпу. Таким образом каждый воркер старается оккупировать одно ядро, а ОС, будучи умной, старается не перемещать подобный процесс между ядрами, сохраняя за ним некоторые ресурсы и, возможно, кеши цпу (но это не точно, я слышал что context switch их вычищает, но это одна бабка сказала). Увеличение же воркеров приведет лишь к тому, что они начнут соревноваться за ядра (т.н. contention) и перемещаться между ними - если ядер четыре, а воркеров пять, то два воркера делят одно ядро, и если оба воркера хотят работать, то ОС вынуждена перенести один из них на другое свободное ядро, что опять же вызывает лишние затраты (но будучи до конца честным, в рамках рубей на эти пару тысяч циклов просто плевать). В любом случае, пока воркеры не простаиввают на блокирующих операциях и их количество >= количеству ядер, добавление новых не даст никакого прироста, а только усугубит ситуацию.