Если все ваши потоки / процессы действительно связаны с процессором, вы должны запустить столько процессов, сколько процессор сообщает ядрам. Благодаря HyperThreading каждое физическое ядро ЦП может иметь возможность представлять несколько виртуальных ядер. Звоните multiprocessing.cpu_count
, чтобы узнать количество виртуальных ядер.
Если только p из 1 ваших потоков привязано к процессору, вы можете отрегулировать это число, умножив на p . Например, если половина ваших процессов привязана к процессору ( p = 0,5) и у вас есть два процессора с 4 ядрами в каждом и 2x HyperThreading, вы должны запустить 0,5 * 2 * 4 * 2 = 8 процессов.
Если у вас слишком мало процессов, ваше приложение будет работать медленнее, чем ожидалось. Если ваше приложение отлично масштабируется и привязано только к процессору (т. Е. В 10 раз быстрее, когда выполняется в 10 раз больше ядер), это означает, что скорость у вас ниже. Например, если ваша система требует 8 процессов, но вы запускаете только 4, вы будете использовать только половину вычислительной мощности и займет вдвое больше времени. Обратите внимание, что на практике ни одно приложение не масштабируется идеально, но некоторые (трассировка лучей, кодирование видео) довольно близки.
Если у вас слишком много процессов, накладные расходы на синхронизацию возрастут. Если ваша программа имеет минимальные или нулевые накладные расходы на синхронизацию, это не повлияет на общее время выполнения, но может привести к тому, что другие программы будут выглядеть медленнее, чем они, если вы не установите свои процессы с более низким приоритетом. Избыточное количество процессов (скажем, 10000) в теории хорошо, если у вашей ОС хороший планировщик. На практике практически любая синхронизация сделает накладные расходы невыносимыми.
Если вы не уверены, привязано ли ваше приложение к процессору и / или идеально масштабируется, просто наблюдайте за нагрузкой на систему с различным числом потоков. Требуется, чтобы загрузка системы была чуть ниже 100%, или, если точнее, uptime - это количество виртуальных ядер.