Портативный способ обнаружения количества * полезных * процессоров в 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. ( то же относится и к любому другому псевдо файлу.)
Ответы
Ответ 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
Это портативный