Как я могу ограничить количество ядер процессора, доступных в os.cpu_count в Windows (предпочтительно через переменную среды)

#python #windows #python-multiprocessing

Вопрос:

Ситуация:

У меня есть несколько (более 40) подобных внешних приложений (например, не разработанных мной), написанных на python и доставляемых в виде исполняемых файлов Windows. Приложения используются os.cpu_count для определения того, сколько работников они должны запустить. Каждый работник использует около 50 МБ оперативной памяти в режиме холостого хода все время во время обычного выполнения. Я использую 8-ядерный процессор с 16 потоками. Все 40 приложений запускают os.cpu_count - 2 работников, которые (эффективно) ничего не делают, так как для выполнения работы, которую они должны выполнять на моем процессоре, достаточно только одного работника на приложение. Это составляет 560 рабочих процессов, которые используют 27 ГБ оперативной памяти без каких-либо преимуществ.

Чего я хочу:

Сделайте так, чтобы приложения запускались максимум двумя рабочими, без каких-либо изменений кода, в Windows.

Что я пытался:

  • Установите для переменной среды NUMBER_OF_PROCESSORS глобально значение 4, так как по какой-то причине я не смог переопределить переменную среды в powershell. Это не было бы предпочтительным решением, так как это повлияет и на другие приложения. Это не сработало
  • Установите соответствие процессора основному процессу с помощью process hacker 2, как только он запустится. Никакого успеха.
  • Установите соответствие процессора при запуске использования start /AFFINITY [n] [.exe] . И все равно безрезультатно. Насколько я понимаю, это должно было сработать. Одна из использованных масок была 0x000000000000000F , следующая 0x00000000000000F0 и так далее, рассчитана с помощью онлайн-калькулятора масок сходства

Комментарии:

1. 27 ГБ оперативной памяти или 27 ГБ адресного пространства? Независимо от этого, посмотрите, работают ли для вас объекты заданий .

2. @IInspectable 27 ГБ основной памяти, которые нельзя объединить в файл подкачки. «Частный рабочий набор» в Диспетчере задач

3. Похоже, это cpp API Windows, не знаю, как его использовать при запуске существующего исполняемого файла.

4. Это C API. Он может быть вызван с любого языка, который может взаимодействовать с C.