Подтвердить что ты не робот

Портативный способ обнаружения количества * полезных * процессоров в Python

На этот вопрос и ответ - Python multiprocessing.cpu_count() возвращает '1' на 4-ядерном Nvidia Jetson TK1 - вывод Python multiprocessing.cpu_count() функция на определенных системах отражает количество активно используемых процессоров, а не количество процессоров, которые фактически могут использоваться вызывающей программой Python.

Общая идиома Python заключается в использовании возвращаемого значения cpu_count() для инициализации количества процессов в Pool. Однако в системах, использующих такую ​​стратегию "динамической активации ЦП", эта идиома ломается довольно плохо (по крайней мере, в относительно спокойной системе).

Есть ли простой (и переносимый) способ получить число используемых процессоров (в отличие от используемого в настоящее время числа) из Python?

Примечания:

  • На этот вопрос не ответил принятый ответ Как узнать количество процессоров, использующих python, поскольку, как отмечено в вопросе, связанном с В верхней части этого вопроса, при печати содержимого /proc/self/status отображаются все 4 ядра как доступные для программы.

  • На мой взгляд, "переносимый" исключает любой подход, который включает в себя анализ содержимого /proc/self/status, формат которого может отличаться от выпуска к выпуску Linux, и который даже не существует на OS X. ( то же относится и к любому другому псевдо файлу.)

4b9b3361

Ответ 1

Я не думаю, что вы получите действительно портативные ответы, поэтому я дам правильный вариант.

Правильный ответ * для Linux - len(os.sched_getaffinity(pid)), где pid может быть 0 для текущего процесса. Эта функция отображается в Python 3.3 и более поздних версиях; если вам это нужно раньше, вам нужно будет сделать причудливое кодирование cffi.

Изменить: вы можете попытаться выяснить, можете ли вы использовать функцию int omp_get_num_procs();, если она существует, это единственный осмысленный ответ, который я нашел на этом вопросе, но я не пробовал его с Python.

Ответ 2

Используйте psutil:

из документа https://psutil.readthedocs.io/en/latest/:

>>> import psutil
>>> psutil.cpu_count()
4
>>> psutil.cpu_count(logical=False)  # Ignoring virtual cores
2

Это портативный